Po pierwsze, nie ma szczególnie dobrego powodu, aby użyć, fdopenjeśli fopenjest to opcja i openjest to drugi możliwy wybór. Nie powinieneś był openotwierać pliku, jeśli chcesz FILE *. Dlatego umieszczenie fdopenna 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ć fopenzamiast open.
fopenzapewnia 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 fscanfinnych 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
openfunkcji.
Moim zdaniem tłumaczenie kończące wiersz częściej fscanfprzeszkadza, 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 openfunkcję.
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 fcloselub fflushw odpowiednich momentach.
Jeśli poszukujesz (aka fsetposlub fseekdrugi 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.
fdopeniopenlubfopeniopen?