ファイル記述子とファイルポインターの違いを知りたい。
また、他のシナリオではなく、どちらのシナリオで使用しますか?
1つはバッファリング(_FILE *
_)され、もう1つはバッファリングされません。実際には、何をしているのかわからない場合や、ファイルが実際にソケットなどである場合を除き、「実際の」ファイル(つまり、ドライブ)から読み取る場合、ほとんど常に_FILE *
_を使用します。 。
fileno()
を使用して_FILE *
_からファイル記述子を取得でき、fdopen()
を使用してファイル記述子からバッファリングされた_FILE *
_を開くことができます。
ファイル記述子は、Posixのopen()
callから取得する単なる整数です。標準のC fopen()
を使用すると、FILE
構造体が返されます。 FILE
構造体には、ファイルの終わりやエラーインジケータ、ストリームの位置など、このファイル記述子が含まれます。
したがって、fopen()
を使用すると、open()
と比較してある程度の抽象化が得られます。一般的にfopen()
を使用する必要があります。これはより移植性があり、FILE
構造体を使用する他のすべての標準C関数、つまりfprintf()
およびファミリを使用できるためです。
どちらかを使用してもパフォーマンスの問題はありません。
ファイル記述子とファイルポインタ
ファイル記述子:
ファイル記述子は、open()
システムコールによって返される整数値です。
int fd = open (filePath, mode);
ファイルポインター:
ファイルポインターは、fopen()
ライブラリー関数によって返されるC構造体へのポインターです。これは、ファイルの識別、ファイル記述子のラッピング、バッファリング機能、および必要な他のすべての機能に使用されますI/O操作の場合。ファイルポインタのタイプは[〜#〜] file [〜#〜]で、その定義は/にあります。"/ 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;
役に立つかもしれないポイントを追加したい。
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
_またはopen
を排他的なビットを設定して使用する必要があります。 C1Xはx
モードを提供しているため、_"rx"
_、_"wx"
_などのモードでfopen
を使用できます。
open
を使用する場合、open(..., O_EXCL | O_RDONLY,... )
またはopen(..., O_CREAT | O_EXCL | O_WRONLY,... )
を検討できます。
たとえば、 fopen()およびファイル作成に関して仮定しないでください を参照してください。
FILE *
は、sprintf()
、sscanf()
、fgets()
、 feof()
など。
ファイル記述子APIは低レベルであるため、ソケット、パイプ、メモリマップファイル(および通常のファイル)を操作できます。
システムコールは、主にread
やwrite
などのファイル記述子を使用します。ライブラリ関数は、ファイルポインター(printf
、scanf
)を使用します。ただし、ライブラリ関数は内部的にシステムコールのみを使用しています。