По-перше, немає особливо вагомих причин використовувати, 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?