簡単な質問、
Freadを使用する場合:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
私のファイルポインタ、fp
は先に移動しますか?
Answer:はい、ファイルポインタの位置は読み取り操作後に自動的に更新されるため、連続する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;
}