1. ホーム
  2. c

[解決済み】C fopenとopenの比較

2022-02-22 07:29:26

質問内容

を使いたい理由(構文的なものを除く)はありますか?

FILE *fdopen(int fd, const char *mode);

または

FILE *fopen(const char *path, const char *mode);

ではなく

int open(const char *pathname, int flags, mode_t mode);

Linux環境でC言語を使用する場合?

解決方法は?

まず、特に理由はないのですが、このように fdopen もし fopen がオプションで open は他の可能な選択肢です。を使うべきではなかったのです。 open を使いたいのであれば、そもそもファイルを開くために FILE * . そのため fdopen というのも、このリストは他のものとあまり似ていないため、正しくなく、混乱を招くからです。ここで重要なのは、C標準の FILE * とOS固有のファイル記述子です。

を使用する主な理由は4つあります。 fopen の代わりに open .

  1. fopen でやっていることよりもずっと速くなる可能性のあるバッファリング IO を提供します。 open .
  2. fopen は、ファイルがバイナリモードで開かれていない場合に行末を変換します。 これは、プログラムが非Unix環境に移植される場合に非常に役に立ちます (ただし、世界はLFのみに収束しつつあるようです (SMTP や HTTP などの IETF テキストベースのネットワークプロトコルは除く))。
  3. A FILE * を使用する機能を提供します。 fscanf といったstdio関数があります。
  4. あなたのコードは、いつか ANSI C しかサポートしない他のプラットフォームに移植する必要があるかもしれません。 open 関数を使用します。

私の意見では、行末の翻訳は役に立つというより邪魔になることが多く、パースすることで fscanf が弱いので、どうしても捨ててしまって、もっと便利なものに変えてしまうんです。

そして、C言語をサポートするほとんどのプラットフォームでは open という関数があります。

残るはバッファリングの問題ですね。 主にファイルを順次読み書きするような場所では、バッファリングのサポートは本当に便利で、大きな速度向上となります。 しかし、バッファリング・サポートは、期待したときにデータがファイルに収まらないという、興味深い問題を引き起こすことがあります。 そのため fclose または fflush を適切なタイミングで使用します。

シークをする場合(通称 fsetpos または fseek 2つ目は標準に準拠した方法で使用するのが少し難しいです)、バッファリングの有用性はすぐに低下してしまいます。

もちろん、私の偏見ですが、私はソケットをよく使うので、ノンブロッキングIOを本当にしたいのです(これは FILE * バッファリングが全くなく、複雑なパース処理が必要な場合が多いので、私の認識には大きな違いがあります。