ファイル記述子とファイル ポインタの違いを知りたいです。
また、どのシナリオで一方を他方の代わりに使用しますか?
1 つはバッファリングされており ( FILE *
)、もう 1 つはバッファリングされていません。実際にはFILE *
、「実際の」ファイル (つまり、ドライブ上) から読み取るときは、ほとんどの場合、自分が何をしているのかわからない場合や、ファイルが実際にソケットなどでない限り、使用したいと考えています。
を使用してファイル記述子を取得でき、FILE *
使用してファイル記述子からfileno()
バッファリングされたものを開くことができFILE *
ますfdopen()
open()
ファイル記述子は、POSIX呼び出しから取得する単なる整数です。標準のCfopen()
を使用すると、FILE
構造体が返されます。構造体には、ファイルのFILE
終わりやエラーインジケータ、ストリームの位置など、特にこのファイル記述子が含まれています。
したがって、を使用fopen()
すると、と比較してある程度の抽象化が得られますopen()
。一般的には、より移植性が高く、構造体、つまりファミリfopen()
を使用する他のすべての標準C関数を使用できるため、使用する必要があります。FILE
fprintf()
どちらを使用してもパフォーマンスの問題はありません。
役に立つかもしれないポイントを追加したい。
約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_s
orを使用する必要があります。open
C1X はモードを提供し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
)を使用します。ただし、ライブラリ関数は内部でシステムコールのみを使用しています。