ファイル記述子とファイルポインタの違いは何ですか?
-
19-09-2019 - |
質問
ファイル記述子とファイルポインタの違いを知りたいです。
また、どのようなシナリオで一方を他方の代わりに使用しますか?
他のヒント
一つは緩衝(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);
- 低/カーネルレベルのハンドラー。
- UNIX システムコールの read() および write() に渡します。
- バッファリングなどの機能は含まれません。
- 持ち運びが難しく、効率も悪くなります。
ファイルポインタ:
ファイル ポインタは、によって返される 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;
- それは高レベルのインターフェイスです。
- fread() 関数と fwrite() 関数に渡されます。
- バッファリング、エラー表示、EOF 検出などが含まれます。
- より高い携帯性と効率性を実現します。
役に立ちそうなポイントを追加したい。
について FILE *
- プロセス間通信(IPC)には使用できません。
- 一般的な目的のバッファリングされた I/O が必要な場合に使用します。(printf、frpintf、snprintf、scanf)
デバッグログ用に何度も使用しています。例、
FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
について FILE DESCRIPTOR
通常は IPC に使用されます。
*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() とファイルの作成について仮定を置かないでください。.
システムコールはほとんど例のread
とwrite
のために、ファイル記述子を使用しています。ライブラリ関数は、ファイルポインタ(printf
、scanf
)を使用します。しかし、ライブラリ関数は、システムがコールのみ、内部で使用しています。