質問

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

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

役に立ちましたか?

解決

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

あなたは、実際のUnixに「裸」のファイルディスクリプタを渡すようにようにread()write()として、呼び出します。

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

あなたは、このようなFILEfread()などの標準C関数にfwrite()ポインタを渡します。

他のヒント

一つは緩衝(FILE *)、他方はありません。あなたは何をしているか知っている限りたり、ファイルが実際にソケットまたはそうでなければ、実際には、あなたは、あなたが「本当の」ファイルから読んでいるとき(つまり、ドライブに。)ほとんど常にFILE *を使用したい..

あなたはFILE *を使用してfileno()からのファイルディスクリプタを取得することができ、あなたが使用してファイルディスクリプタからバッファFILE *を開くことができますfdopen()

ファイル・ディスクリプタを使用すると、POSIXの「open()callから得るだけの整数です。標準C fopen()を使用すると、FILEの構造体を取り戻します。 FILE構造体は、位置などをストリーミングする、などのファイル終了とエラー指標としてとりわけ、このファイルディスクリプタが含まれています。

だから、fopen()を使用すると、あなたにopen()に比べて抽象化の一定量を与えます。それは、よりポータブルであり、あなたは、すなわちfopen()や家族をFILE構造体を使用する他のすべての標準C関数を使用することができますので、一般的には、あなたはfprintf()を使用する必要があります。

のいずれかもしくはます。

使用してもパフォーマンス上の問題はありません

ファイル記述子とファイルポインタ

ファイル記述子:

ファイル記述子は、によって返される整数値です。 open() システムコール。

int fd = open (filePath, mode);

  1. 低/カーネルレベルのハンドラー。
  2. UNIX システムコールの read() および write() に渡します。
  3. バッファリングなどの機能は含まれません。
  4. 持ち運びが難しく、効率も悪くなります。

ファイルポインタ:

ファイル ポインタは、によって返される C 構造体へのポインタです。 fopen() ライブラリ関数。これは次の目的で使用されます。 ファイルの識別、ファイル記述子のラップ、バッファリング機能、および I/O 操作に必要なその他すべての機能ファイル ポインタのタイプは次のとおりです。 ファイル, 、その定義は次のとおりです。 「/usr/include/stdio.h」. 。この定義はコンパイラによって異なる場合があります。

FILE *fp = fopen (filePath, mode);

// A FILE Structure returned by fopen 
    typedef struct 
    {
        unsigned char   *_ptr;
        int     _cnt;
        unsigned char   *_base;
        unsigned char   *_bufendp;
        short   _flag;
        short   _file;
        int     __stdioid;
        char    *__newbase;
#ifdef _THREAD_SAFE
        void *_lock;
#else
        long    _unused[1];
#endif
#ifdef __64BIT__
        long    _unused1[4];
#endif /* __64BIT__ */
    } FILE;
  1. それは高レベルのインターフェイスです。
  2. fread() 関数と fwrite() 関数に渡されます。
  3. バッファリング、エラー表示、EOF 検出などが含まれます。
  4. より高い携帯性と効率性を実現します。

役に立ちそうなポイントを追加したい。

について 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 *.

それはあなたがFILE *sprintf()sscanf()fgets()など

のようなAPI関数を使用することができますので、あなたが、テキストファイルとユーザーの入力/出力を操作するとき、

feof()はより有用です

ファイルディスクリプタAPIの低レベルなので、(もちろん、および通常のファイル)ソケット、パイプ、メモリマップドファイルで作業することができます。

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

fopen 安全ではない可能性があるため、おそらく使用する必要があります fopen_s または open 専用ビットを設定した状態。C1Xが提供するのは x モードがあるため、次のことができます fopen モード付き "rx", "wx", 、など。

使用する場合 open, 、あなたは考えるかもしれません open(..., O_EXCL | O_RDONLY,... ) または open(..., O_CREAT | O_EXCL | O_WRONLY,... ).

たとえば、次を参照してください。 fopen() とファイルの作成について仮定を置かないでください。.

システムコールはほとんど例のreadwriteのために、ファイル記述子を使用しています。ライブラリ関数は、ファイルポインタ(printfscanf)を使用します。しかし、ライブラリ関数は、システムがコールのみ、内部で使用しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top