簡単な質問、
freadを使用する場合:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
私のファイルポインタfp
は先に移動しますか?
回答:はい。ファイルポインタの位置は読み取り操作後に自動的に更新されるため、連続fread()
する関数は連続するファイルレコードを読み取ります。
明確化: fread()
ブロック指向の関数です。標準のプロトタイプは次のとおりです。
size_t fread(void *ptr,
size_t size,
size_t limit,
FILE *stream);
この関数は、が指すストリームから読み取り、読み取っstream
たバイトをが指す配列に配置しptr
ます。次の条件のいずれかが当てはまると、読み取りを停止します。
limit
サイズの要素を読み取ったsize
、または fread()
と同じくらい多くの制御が可能fgetc()
であり、1回のI/O操作で複数の文字を読み取ることができるという利点があります。実際、メモリが許せば、ファイル全体を配列に読み込んで、すべての処理をメモリ内で実行できます。これには、パフォーマンス上の大きな利点があります。
fread()
多くの場合、固定長のデータレコードを構造体に直接読み込むために使用されますが、任意のファイルを読み込むために使用できます。これは、ほとんどのディスクファイルを読み取るための私の個人的な選択です。
はい、freadを呼び出すと、実際にファイルポインタが移動します。ファイルポインタは、実際に読み取られたバイト数だけ進められます。freadでエラーが発生した場合、freadを呼び出した後のファイルの位置は指定されていません。
はい、fp
読み取られたバイトの合計量だけ進められます。
あなたの場合、関数freadは、によってポイントされたストリームからsizeBlock
各バイト長のオブジェクトを読み取り、によって指定された場所にそれらを格納します。sizeof(Reg)
fp
ArrayA
はい、そうです。現在の位置(実際には、これまでに読み取られたバイト)を表示するためにftell()関数を使用して確認できます。これを見てください。
int main() {
typedef struct person {
char *nome; int age;
} person;
// write struct to file 2x or more...
FILE *file = fopen(filename, "rb");
person p;
size_t byteslength = sizeof(struct person);
printf("ftell: %ld\n", ftell(file));
fread(&p, byteslength, 1, file);
printf("name: %s | age: %d\n", p.nome, p.idade);
printf("ftell: %ld\n", ftell(file));
fread(&p, byteslength, 1, file);
printf("name: %s | age: %d\n", p.nome, p.idade);
//...
fclose(file);
return 0;
}