Po pierwsze, nie ma szczególnie dobrego powodu, aby użyć, fdopen
jeśli fopen
jest to opcja i open
jest to drugi możliwy wybór. Nie powinieneś był open
otwierać pliku, jeśli chcesz FILE *
. Dlatego umieszczenie fdopen
na tej liście jest niepoprawne i mylące, ponieważ nie jest bardzo podobne do innych. Teraz będę go ignorować, ponieważ ważne jest tutaj rozróżnienie między standardem C.FILE *
a deskryptorem pliku specyficznym dla systemu operacyjnego.
Istnieją cztery główne powody, aby używać fopen
zamiast open
.
fopen
zapewnia buforowanie operacji we / wy, które mogą okazać się znacznie szybsze niż to, co robisz open
.
fopen
wykonuje translację zakończeń linii, jeśli plik nie jest otwarty w trybie binarnym, co może być bardzo pomocne, jeśli Twój program jest kiedykolwiek przenoszony do środowiska innego niż Unix (chociaż świat wydaje się być zbieżny tylko w LF (z wyjątkiem sieci tekstowej IETF) protokoły takie jak SMTP i HTTP itp.).
- A
FILE *
daje możliwość korzystania z fscanf
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 tej
open
funkcji.
Moim zdaniem tłumaczenie kończące wiersz częściej fscanf
przeszkadza, niż pomaga, a parsowanie jest tak słabe, że nieuchronnie kończy się to rzuceniem go na coś bardziej przydatnego.
I większość platform obsługujących C ma open
funkcję.
To pozostawia pytanie buforujące. W miejscach, w których głównie czytasz lub zapisujesz plik sekwencyjnie, obsługa buforowania jest naprawdę pomocna i znacznie poprawia szybkość. Ale może to prowadzić do interesujących problemów, w których dane nie kończą się w pliku, gdy się go spodziewasz. Musisz pamiętać o tym fclose
lub fflush
w odpowiednich momentach.
Jeśli poszukujesz (aka fsetpos
lub fseek
drugi jest nieco trudniejszy do użycia w sposób zgodny ze standardami), użyteczność buforowania szybko spada.
Oczywiście, moja stronniczość polega na tym, że często pracuję z gniazdami, a tam jest fakt, że naprawdę chcesz robić nie blokujące IO (które FILE *
całkowicie nie obsługuje w żaden rozsądny sposób) bez buforowania i często złożone wymagania dotyczące parsowania naprawdę koloryzują moje postrzeganie.
fdopen
iopen
lubfopen
iopen
?