ファイル記述子とファイル ポインタの違いを知りたいです。
また、どのシナリオで一方を他方の代わりに使用しますか?
1 つはバッファリングされており ( FILE *)、もう 1 つはバッファリングされていません。実際にはFILE *、「実際の」ファイル (つまり、ドライブ上) から読み取るときは、ほとんどの場合、自分が何をしているのかわからない場合や、ファイルが実際にソケットなどでない限り、使用したいと考えています。
を使用してファイル記述子を取得でき、FILE *使用してファイル記述子からfileno()バッファリングされたものを開くことができFILE *ますfdopen()
open()ファイル記述子は、POSIX呼び出しから取得する単なる整数です。標準のCfopen()を使用すると、FILE構造体が返されます。構造体には、ファイルのFILE終わりやエラーインジケータ、ストリームの位置など、特にこのファイル記述子が含まれています。
したがって、を使用fopen()すると、と比較してある程度の抽象化が得られますopen()。一般的には、より移植性が高く、構造体、つまりファミリfopen()を使用する他のすべての標準C関数を使用できるため、使用する必要があります。FILEfprintf()
どちらを使用してもパフォーマンスの問題はありません。
役に立つかもしれないポイントを追加したい。
約FILE *
デバッグログに何度も使用しています。例、
FILE *fp;
fp = fopen("debug.txt","a");
fprintf(fp,"I have reached till this point");
fclose(fp);
約FILE DESCRIPTOR
一般に IPC に使用されます。
*nix システム上のファイル (デバイス、ファイル、ソケットなど) に低レベルの制御を与えるため、FILE *.
ディスカッションを終了するためのメモ (興味がある場合)...
fopen安全ではない可能性があるため、排他ビットを設定してfopen_sorを使用する必要があります。openC1X はモードを提供しxているのでfopen、モード"rx"、"wx"などを使用できます。
を使用する場合は、またはopenを検討してください。open(..., O_EXCL | O_RDONLY,... )open(..., O_CREAT | O_EXCL | O_WRONLY,... )
たとえば、「 fopen() とファイルの作成について想定しない」を参照してください。
FILE *sprintf()、sscanf()、などのAPI 関数を使用できるため、テキスト ファイルやユーザー入出力を操作する場合により便利ですfgets()。feof()
ファイル記述子 API は低レベルであるため、ソケット、パイプ、メモリ マップ ファイル (もちろん通常のファイルも) を操作できます。
システムコールは主にファイル記述子を使用しています。たとえばread、と write。ライブラリ関数はファイルポインタ(printf、scanf)を使用します。ただし、ライブラリ関数は内部でシステムコールのみを使用しています。