C fopen vs open
Czy Jest jakiś powód (inny niż składniowy), który chciałbyś użyć
FILE *fdopen(int fd, const char *mode);
Lub
FILE *fopen(const char *path, const char *mode);
Zamiast
int open(const char *pathname, int flags, mode_t mode);
Kiedy używasz C w środowisku Linux?
11 answers
Po pierwsze, nie ma szczególnie dobrego powodu, aby używać fdopen
Jeśli fopen
jest opcją, a open
jest innym możliwym wyborem. Nie powinieneś używać open
, aby otworzyć plik, jeśli chcesz FILE *
. Więc włączenie fdopen
do tej listy jest niepoprawne i mylące, ponieważ nie jest bardzo podobne do innych. Teraz przejdę do zignorowania go, ponieważ ważna różnica jest między standardem C FILE *
A deskryptorem pliku specyficznym dla systemu operacyjnego.
Istnieją cztery główne powody, użyj fopen
zamiast open
.
-
fopen
zapewnia buforowanie IO, które może okazać się o wiele szybsze niż to, co robisz zopen
. -
fopen
robi tłumaczenie zakończenia linii, jeśli plik nie jest otwarty w trybie binarnym, co może być bardzo pomocne, jeśli twój program jest kiedykolwiek przeniesiony do środowiska non-Unix (chociaż świat wydaje się być zbieżny tylko na LF (Z wyjątkiem tekstowych protokołów sieciowych IETF, takich jak SMTP i HTTP itp.)). - a
FILE *
daje Ci możliwość korzystania zfscanf
i innych funkcji stdio. - Twój kod może kiedyś wymagać przeniesienia na inną platformę, która obsługuje tylko ANSI C i nie obsługuje funkcji
open
.
Moim zdaniem tłumaczenie kończące się linijką częściej wchodzi ci w drogę niż ci pomaga, a parsowanie fscanf
jest tak słabe, że nieuchronnie kończysz na wyrzuceniu go na rzecz czegoś bardziej użytecznego.
I większość platform obsługujących C posiada funkcję open
.
Że pozostaje pytanie buforujące. W miejscach, gdzie głównie czytasz lub piszesz plik sekwencyjnie, obsługa buforowania jest naprawdę pomocna i duża poprawa szybkości. Ale może to prowadzić do ciekawych problemów, w których dane nie trafiają do pliku, gdy oczekujesz, że tam będą. Musisz pamiętać o fclose
lub fflush
w odpowiednim czasie.
Jeśli robisz seek (aka fsetpos
lub fseek
druga z nich jest nieco trudniejsza do wykorzystania w sposób zgodny ze standardami), przydatność buforowania szybko spada.
Oczywiście moja tendencja polega na tym, że często pracuję z gniazdami, a tam fakt, że naprawdę chcesz robić nieblokujące IO (które {4]} całkowicie nie obsługuje w żaden rozsądny sposób) bez buforowania i często mają złożone wymagania dotyczące parsowania naprawdę kolorują moje postrzeganie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-17 04:37:24
open()
jest wywołaniem systemu operacyjnego niskiego poziomu. fdopen()
konwertuje deskryptor pliku poziomu systemu operacyjnego na plik wyższego poziomu-abstrakcję języka C. fopen()
wywołuje open()
w tle i daje bezpośrednio wskaźnik pliku.
Istnieje kilka zalet używania obiektów plików raczej surowych deskryptorów plików, co obejmuje większą łatwość użycia, ale także inne zalety techniczne, takie jak wbudowane buforowanie. Szczególnie buforowanie powoduje na ogół znaczne przewaga wydajności.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-01 22:00:19
Fopen vs open in C
1) fopen
jest funkcją biblioteczną podczas gdy open
jest wywołaniem systemowym.
2) fopen
zapewnia buforowane IO, które jest szybsze w porównaniu do open
, które jest nie buforowane.
3) fopen
is portable while open
not portable (open jest specyficzne dla środowiska ).
4) fopen
zwraca wskaźnik do struktury pliku (Plik *); open
Zwraca liczbę całkowitą, która identyfikuje plik.
5) a FILE *
daje możliwość korzystania z fscanf i innych funkcji stdio.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 05:28:21
O ile nie należysz do 0,1% aplikacji, w których używanie open
jest rzeczywistą korzyścią z wydajności, naprawdę nie ma dobrego powodu, aby nie używać fopen
. Jeśli chodzi o fdopen
, jeśli nie odtwarzasz deskryptorów plików, nie potrzebujesz tego połączenia.
Trzymać się fopen
i jego rodziny metod (fwrite
, fread
, fprintf
, et al) I będziesz bardzo zadowolony. Co równie ważne, inni programiści będą zadowoleni z twojego kodu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-24 03:39:22
Jeśli masz FILE *
, możesz użyć takich funkcji jak fscanf
, fprintf
i fgets
itd. Jeśli masz tylko deskryptor pliku, masz ograniczone (ale prawdopodobnie szybsze) procedury wejścia i wyjścia read
, write
itd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-01 21:53:41
Używanie open, read, write oznacza, że musisz martwić się o interwencje sygnału.
Jeśli wywołanie zostało przerwane przez obsługę sygnału, funkcje zwrócą -1 i ustawić errno na Eintr.
Więc właściwym sposobem zamknięcia pliku będzie
while (retval = close(fd), retval == -1 && ernno == EINTR) ;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-05 09:31:08
open()
jest wywołaniem systemowym i specyficznym dla systemów uniksowych i zwraca deskryptor pliku. Możesz zapisać do deskryptora pliku używając write()
, która jest kolejnym wywołaniem systemowym.fopen()
jest wywołaniem funkcji ANSI C, która zwraca wskaźnik pliku i jest przenośna do innych systemów operacyjnych. Możemy zapisać do wskaźnika pliku używając fprintf
.
W Unixie:
Wskaźnik pliku można uzyskać z deskryptora pliku za pomocą:
fP = fdopen(fD, "a");
Można uzyskać deskryptor pliku ze wskaźnika pliku za pomocą:
fD = fileno (fP);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-20 01:37:39
Open () zostanie wywołane na końcu każdej z funkcji rodziny fopen(). open () jest wywołaniem systemowym i fopen () są dostarczane przez biblioteki jako funkcje opakowujące dla użytkownika łatwe w użyciu
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-09 07:03:51
Zmieniłem na open () z fopen () dla mojej aplikacji, ponieważ fopen powodował podwójne odczyty za każdym razem, gdy uruchamiałem fopen fgetc . Podwójne odczyty zakłócały to, co chciałem osiągnąć. open() wydaje się robić to, o co prosisz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-03 19:24:22
Zależy również od tego, jakie flagi są wymagane do otwarcia. W odniesieniu do użycia do pisania i czytania (i przenośności) f * powinny być używane, jak argumentowano powyżej.
Ale jeśli chcesz podać więcej niż standardowe flagi (takie jak rw i append flags), będziesz musiał użyć specyficznego dla platformy API (takiego jak POSIX open) lub biblioteki, która abstrahuje te szczegóły. Standard C nie posiada takich flag.
Na przykład możesz chcieć otworzyć plik, tylko jeśli zakończy działanie. Jeśli nie określisz flaga create plik musi istnieć. Jeśli dodasz exclusive do create, utworzy on plik tylko wtedy, gdy nie istnieje. Jest ich o wiele więcej.
Na przykład w systemach Linux jest wyświetlany interfejs LED przez sysfs. Wyświetla jasność diody led przez plik. Zapis lub odczyt liczby w postaci ciągu znaków od 0-255. Oczywiście nie chcesz tworzyć tego pliku i pisać do niego tylko wtedy, gdy istnieje. Teraz fajna sprawa: użyj fdopen do odczytu/zapisu tego pliku przy użyciu standardowego telefony.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-11 10:45:19
Otwieranie pliku za pomocą fopen
zanim będziemy mogli odczytać (lub zapisać) informacje z (do) pliku na dysku musimy otworzyć plik. aby otworzyć plik, wywołaliśmy funkcję fopen.
1.firstly it searches on the disk the file to be opened.
2.then it loads the file from the disk into a place in memory called buffer.
3.it sets up a character pointer that points to the first character of the buffer.
Ten sposób zachowania fopen Funkcja
istnieją pewne przyczyny podczas procesu buforowania, może to timedout. tak więc porównując fopen(high level i/o) do Otwórz (low level I/o) wywołanie systemowe , i jest szybsze bardziej odpowiednie niż fopen.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-22 20:32:57