GNU/Linux >> Linux の 問題 >  >> Linux

C fopen と open

まず、fdopen を使用する特別な理由はありません。 fopen の場合 はオプションで、open 他の可能な選択肢です。 open を使うべきではありませんでした FILE * が必要な場合は、最初にファイルを開く . fdopen を含む そのリストの は、他のものとあまり似ていないため、正しくなく、混乱を招きます。ここでの重要な違いは C 標準の FILE * と および OS 固有のファイル記述子。

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

<オール>
  • fopen open で行っているよりもはるかに高速であることが判明するバッファリング IO を提供します。 .
  • fopen ファイルがバイナリ モードで開かれていない場合、行末の変換を行います。これは、プログラムが Unix 以外の環境に移植された場合に非常に役立ちます (世界は LF のみに収束しているように見えますが (IETF テキストベースのネットワーキングを除く)。 SMTP や HTTP などのプロトコル)).
  • A FILE * fscanf を使用できるようになります およびその他の stdio 関数。
  • あなたのコードは、いつか ANSI C のみをサポートし、open をサポートしない他のプラットフォームに移植する必要があるかもしれません。 関数。
  • 私の意見では、行末の翻訳はあなたを助けるよりも邪魔になることが多く、 fscanf の解析は は非常に弱いため、必然的に、より有用なものを優先して捨ててしまいます。

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

    バッファリングの問題が残ります。主にファイルを順番に読み書きする場所では、バッファリングのサポートが非常に役立ち、速度が大幅に向上します。しかし、データがファイルにあるはずのときにデータがファイルに入らないという興味深い問題が発生する可能性があります。 fclose まで覚えておいてください または fflush

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

    もちろん、私の偏見は、私はソケットを頻繁に使用する傾向があるということです。実際には、非ブロッキング IO (FILE *) を実行したいという事実があります。 合理的な方法で完全にサポートできません) バッファリングがまったくなく、多くの場合、複雑な解析要件が実際に私の認識を彩ります。


    fopen と C でのオープン

    1) fopen ライブラリ関数です open の間 システムコールです .

    2) fopen バッファリングされた IO を提供します open に比べて高速です バッファリングされていない .

    3) fopen ポータブルです open の間 ポータブルではありません (オープンは環境固有です ).

    4) fopen FILE 構造体 (FILE *) へのポインタを返します; open ファイルを識別する整数を返します。

    5) FILE * fscanf を使用できるようになります およびその他の stdio 関数。


    open() 低レベルの os 呼び出しです。 fdopen() OS レベルのファイル記述子を C 言語の高レベルの FILE 抽象化に変換します。 fopen() open() を呼び出します バックグラウンドでファイルポインターを直接提供します。

    生のファイル記述子ではなく FILE オブジェクトを使用することにはいくつかの利点があります。これには、使いやすさだけでなく、組み込みのバッファリングなどの他の技術的な利点も含まれます。特にバッファリングは、一般にかなりのパフォーマンス上の利点をもたらします。


    Linux
    1. Ubuntu – Linuxで.bakファイルを開く方法は?

    2. 男と.8ファイルを開く方法は?

    3. fopen() は Linux のスレッドセーフ関数ですか?

    1. Linux インタビューの質問 :オープン ファイル / オープン ファイル記述子

    2. Fedora 23 で .rar ファイルを開く方法

    3. コマンドの結果として指定されたファイルを vim で開く

    1. Python の open() は、ファイルが存在しない場合、ファイルを作成しません。

    2. libaio.so.1:共有オブジェクト ファイルを開けません

    3. node-webkit のデフォルト プログラムでファイルを開く