По-перше, немає особливо вагомих причин використовувати, fdopen
якщо fopen
це варіант, а open
є іншим можливим вибором. open
Якщо ви хочете, ви не повинні раніше відкривати файл FILE *
. Тож включення fdopen
до цього списку є невірним та заплутаним, оскільки воно не дуже схоже на інші. Зараз я перейду до його ігнорування, оскільки тут важлива відмінність між стандартом C FILE *
та дескриптором файлів, характерних для ОС.
Існує чотири основні причини використовувати fopen
замість open
.
fopen
надає вам буферний IO, який може виявитися набагато швидшим, ніж те, що ви робите open
.
fopen
робить переклад, що закінчується трансляцією, якщо файл не відкрито у двійковому режимі, що може бути дуже корисно, якщо ваша програма коли-небудь переноситься в не-Unix-середовище (хоча світ, схоже, конвергується лише на LF (за винятком текстових мереж на основі IETF) протоколи типу SMTP і HTTP і подібні)).
- A
FILE *
дає можливість використовувати fscanf
та інші функції stdio.
- Ваш код може колись потрібно перенести на якусь іншу платформу, яка підтримує лише ANSI C і не підтримує цю
open
функцію.
На мою думку, рядок, що закінчується перекладом, частіше заважає тобі, ніж допомагає, і синтаксичний розбір fscanf
настільки слабкий, що ти неминуче в кінці підкидаєш його на користь чогось більш корисного.
І більшість платформ, які підтримують C, мають open
функцію.
Це залишає питання буферизації. У місцях, де ви в основному читаєте або записуєте файл послідовно, підтримка буферизації є дуже корисною та значною швидкістю. Але це може призвести до деяких цікавих проблем, коли дані не закінчуються у файлі, коли ви очікуєте їх наявності. Ви повинні пам’ятати про це fclose
або fflush
у відповідний час
Якщо ви займаєтеся прагненнями (ака fsetpos
або fseek
другий з них трохи складніше використовувати у відповідності зі стандартами), корисність буферизації швидко знижується.
Звичайно, моя упередженість полягає в тому, що я, як правило, працюю з розетками багато, і там факт, що ви дійсно хочете робити не блокуючий IO (який FILE *
повністю не може підтримувати будь-яким розумним способом) без буферизації взагалі і часто вимоги до синтаксичного розбору дійсно забарвлюють мої уявлення.
fdopen
іopen
чиfopen
і іopen
?