135

ファイル記述子とファイル ポインタの違いを知りたいです。

また、どのシナリオで一方を他方の代わりに使用しますか?

4

9 に答える 9

167

ファイル記述子は、Linuxやその他のUnixライクなシステムで、カーネルレベルで開かれたファイル(またはソケットなど)を識別するために使用される低レベルの整数の「ハンドル」です。

「裸の」ファイル記述子を、などの実際のUnix呼び出しに渡しread()ますwrite()

ポインタはC標準のFILEライブラリレベルの構造であり、ファイルを表すために使用されます。ラップはファイル記述子をラップし、FILEI/Oを容易にするためにバッファリングやその他の機能を追加します。

FILEなどの標準C関数へのポインタを渡します。fread()fwrite()

于 2010-03-11T09:09:23.210 に答える
71

1 つはバッファリングされており ( FILE *)、もう 1 つはバッファリングされていません。実際にはFILE *、「実際の」ファイル (つまり、ドライブ上) から読み取るときは、ほとんどの場合、自分が何をしているのかわからない場合や、ファイルが実際にソケットなどでない限り、使用したいと考えています。

を使用してファイル記述子を取得でき、FILE *使用してファイル記述子からfileno()バッファリングされたものを開くことができFILE *ますfdopen()

于 2010-03-11T09:14:37.223 に答える
26

open()ファイル記述子は、POSIX呼び出しから取得する単なる整数です。標準のCfopen()を使用すると、FILE構造体が返されます。構造体には、ファイルのFILE終わりやエラーインジケータ、ストリームの位置など、特にこのファイル記述子が含まれています。

したがって、を使用fopen()すると、と比較してある程度の抽象化が得られますopen()。一般的には、より移植性が高く、構造体、つまりファミリfopen()を使用する他のすべての標準C関数を使用できるため、使用する必要があります。FILEfprintf()

どちらを使用してもパフォーマンスの問題はありません。

于 2010-03-11T09:10:22.167 に答える
12

役に立つかもしれないポイントを追加したい。

FILE *

  1. プロセス間通信(IPC)には使用できません。
  2. 汎用のバッファ I/O が必要な場合に使用します (printf、frpintf、snprintf、scanf)。
  3. デバッグログに何度も使用しています。例、

                 FILE *fp;
                 fp = fopen("debug.txt","a");
                 fprintf(fp,"I have reached till this point");
                 fclose(fp);
    

FILE DESCRIPTOR

  1. 一般に IPC に使用されます。

  2. *nix システム上のファイル (デバイス、ファイル、ソケットなど) に低レベルの制御を与えるため、FILE *.

于 2013-02-09T20:19:13.817 に答える
3

ディスカッションを終了するためのメモ (興味がある場合)...

fopen安全ではない可能性があるため、排他ビットを設定してfopen_sorを使用する必要があります。openC1X はモードを提供しxているのでfopen、モード"rx""wx"などを使用できます。

を使用する場合は、またはopenを検討してください。open(..., O_EXCL | O_RDONLY,... )open(..., O_CREAT | O_EXCL | O_WRONLY,... )

たとえば、「 fopen() とファイルの作成について想定しない」を参照してください。

于 2013-02-12T11:39:56.803 に答える
3

FILE *sprintf()sscanf()、などのAPI 関数を使用できるため、テキスト ファイルやユーザー入出力を操作する場合により便利ですfgets()feof()

ファイル記述子 API は低レベルであるため、ソケット、パイプ、メモリ マップ ファイル (もちろん通常のファイルも) を操作できます。

于 2010-03-11T09:12:26.920 に答える
1

システムコールは主にファイル記述子を使用しています。たとえばread、と write。ライブラリ関数はファイルポインタ(printfscanf)を使用します。ただし、ライブラリ関数は内部でシステムコールのみを使用しています。

于 2010-03-11T09:12:11.740 に答える