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?

Author: tshepang, 2009-11-01

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.

  1. fopen zapewnia buforowanie IO, które może okazać się o wiele szybsze niż to, co robisz z open.
  2. 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.)).
  3. a FILE * daje Ci możliwość korzystania z fscanf i innych funkcji stdio.
  4. 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.

 252
Author: Omnifarious,
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.

 59
Author: Emil H,
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.

 36
Author: Yogeesh H T,
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.

 14
Author: user7116,
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.

 11
Author: dreamlax,
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) ;
 7
Author: digy,
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);
 6
Author: Arun Chettoor,
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

 4
Author: theadnangondal,
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.

 2
Author: Ersatz Splatt,
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.

 2
Author: Ritualmaster,
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.

 -1
Author: prashad,
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