最初に、がオプションであり、が他の可能な選択肢であるfdopen
場合に使用する特別な理由はありません。必要な場合は、最初からファイルを開くために使用するべきではありませんでした。そのため、そのリストに含めることは、他のものとあまり似ていないため、正しくなく、混乱しています。ここで重要な違いはC標準とOS固有のファイル記述子の間であるため、ここでは無視します。fopen
open
open
FILE *
fdopen
FILE *
のfopen
代わりに使用する主な理由は4つありますopen
。
fopen
では、バッファリングIOが提供されますopen
。これは、実際の処理よりもはるかに高速になる場合があります。
fopen
ファイルがバイナリモードで開かれていない場合は行末変換を行います。これは、プログラムが非UNIX環境に移植された場合に非常に役立ちます(ただし、世界はLFのみに収束しているように見えます(IETFテキストベースのネットワークを除く)。 SMTPやHTTPなどのプロトコル))。
- A
FILE *
を使用するfscanf
と、他のstdio関数を使用できます。
- ANSI Cのみをサポートし、
open
関数をサポートしない他のプラットフォームにコードを移植する必要がある場合があります。
私の意見では、行末の翻訳はあなたを助けるよりも頻繁に邪魔になり、の解析fscanf
は非常に弱いので、あなたは必然的にそれをより有用な何かのために放棄することになります。
また、Cをサポートするほとんどのプラットフォームにはopen
関数があります。
それはバッファリングの問題を残します。主に順次ファイルの読み取りまたは書き込みを行う場所では、バッファリングのサポートが非常に役立ち、速度が大幅に向上します。しかし、データがファイルにあると予期しても、データがファイルに含まれないという興味深い問題が発生する可能性があります。あなたは、fclose
またはfflush
適切な時に覚えておく必要があります。
シークを行っている場合(別名fsetpos
またはfseek
その2番目は、標準に準拠した方法で使用するには少しトリッキーです)、バッファリングの有用性はすぐに低下します。
もちろん、私のバイアスは、私がソケットFILE *
を頻繁に使用する傾向があることであり、非ブロッキングIO(まったく合理的な方法で完全にサポートされていない)をバッファリングなしで頻繁に実行したいという事実があります複雑な構文解析要件があると、私の認識が本当に変わります。
fdopen
とopen
かfopen
とopen
?