使用したい理由はありますか(構文上の理由以外)
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
を使用する特に適切な理由はありません。 FILE *
が必要な場合、最初にopen
を使用してファイルを開くべきではありません。そのため、そのリストにfdopen
を含めることは、他のものとあまり似ていないため、不正確でわかりにくいものです。ここで重要な違いは、C標準のFILE *
とOS固有のファイル記述子であるため、これを無視します。
fopen
の代わりにopen
を使用する主な理由は4つあります。
fopen
は、バッファリングIOを提供します。__<< IO>] _は、open
を使用した場合よりもはるかに高速になることがあります。fopen
は、ファイルがバイナリモードで開かれていない場合に行末変換を行います。これは、プログラムが非Unix環境に移植されている場合に非常に役立ちます。FILE *
を使用すると、fscanf
およびその他のstdio関数を使用できます。open
関数をサポートしない他のプラットフォームにコードを移植する必要があるかもしれません。私の意見では、翻訳を終了する行はあなたを助けるよりもあなたの邪魔になることが多く、fscanf
の解析は非常に弱く、必然的にあなたはそれを捨ててより有用なものを支持することになります。
また、Cをサポートするほとんどのプラットフォームにはopen
関数があります。
それはバッファリングの質問を残します。主にファイルを順番に読み書きする場所では、バッファリングのサポートが非常に役立ち、速度が大幅に向上します。しかし、データがファイルにあると予想されるときにデータがファイルに収まらないという興味深い問題につながる可能性があります。適切なタイミングでfclose
またはfflush
を覚えておく必要があります。
シーク(別名fsetpos
またはfseek
を使用している場合、2番目は標準に準拠した方法で使用するのが少し難しい)の場合、バッファリングの有用性はすぐに低下します。
もちろん、私の偏見は、私はソケットをたくさん使う傾向があることであり、あなたは本当に非ブロッキングIO(これはFILE *
が合理的な方法で完全にサポートできない)バッファリングがまったくなく、多くの場合、複雑な解析要件があり、実際に私の認識を色付けします。
Cでfopen vs open
1)fopen
はライブラリ関数で、open
はシステムコールです。
2)fopen
はbuffered IOを提供します。これはnon bufferedであるopen
と比較して高速です。
3)fopen
はportableですが、open
はportable(openは環境固有)です。
4)fopen
は、FILE構造体(FILE *)へのポインターを返します。 open
は、ファイルを識別する整数を返します。
5)FILE *
を使用すると、fscanfおよびその他のstdio関数を使用できます。
FILE *
がある場合は、fscanf
、fprintf
、fgets
などの関数を使用できます。ファイル記述子だけがある場合は、入力および出力ルーチンread
、write
などを制限します(ただし、高速になる可能性があります)。
open
を使用することが実際のパフォーマンス上の利点であるアプリケーションの0.1%の一部でない限り、fopen
を使用しない正当な理由はありません。 fdopen
に関する限り、ファイル記述子で遊んでいないのであれば、その呼び出しは必要ありません。
fopen
とそのメソッドファミリ(fwrite
、fread
、fprintf
など)を使用すると、非常に満足します。同様に重要なことは、他のプログラマーがあなたのコードに満足することです。
オープン、読み取り、書き込みを使用すると、信号の相互作用を心配する必要があります。
呼び出しがシグナルハンドラによって中断された場合、関数は-1を返し、errnoをEINTRに設定します。
したがって、ファイルを閉じる適切な方法は
while (retval = close(fd), retval == -1 && ernno == EINTR) ;
open()は、各fopen()ファミリ関数の最後に呼び出されます。 open()はシステムコールであり、fopen()はユーザーが使いやすいようにラッパー関数としてライブラリによって提供されます
open()
はシステムコールであり、Unixベースのシステムに固有であり、ファイル記述子を返します。別のシステムコールであるwrite()
を使用して、ファイル記述子に書き込むことができます。fopen()
は、ファイルポインターを返すANSI C関数呼び出しであり、他のOSに移植可能です。 fprintf
を使用して、ファイルポインターに書き込むことができます。
Unixの場合:
次を使用して、ファイル記述子からファイルポインターを取得できます。
fP = fdopen(fD, "a");
次を使用して、ファイルポインターからファイル記述子を取得できます。
fD = fileno (fP);
開くために必要なフラグにも依存します。書き込みおよび読み取り(および移植性)の使用に関しては、上記のようにf *を使用する必要があります。
ただし、基本的に標準フラグ(rwやappendフラグなど)以外を指定する場合は、プラットフォーム固有のAPI(POSIX openなど)またはこれらの詳細を抽象化するライブラリを使用する必要があります。 C標準には、このようなフラグはありません。
たとえば、ファイルが存在する場合にのみ、ファイルを開くことができます。作成フラグを指定しない場合、ファイルが存在する必要があります。作成する排他を追加すると、ファイルが存在しない場合にのみファイルが作成されます。他にもたくさんあります。
たとえば、Linuxシステムでは、sysfsを通じて公開されるLEDインターフェイスがあります。ファイルを介してledの明るさを公開します。 0〜255の範囲の文字列としての数値の書き込みまたは読み取り。もちろん、そのファイルを作成したくないので、存在する場合にのみ書き込みます。クールなこと:fdopenを使用して、標準呼び出しを使用してこのファイルを読み書きします。
アプリケーションのfopen()からopen()に変更しました。fopenfgetcを実行するたびにfopenが二重読み取りを引き起こしたためです。二重読み取りは、私が達成しようとしていたことを破壊するものでした。 open()はあなたが求めていることをしているようです。