web-dev-qa-db-ja.com

freadはファイルポインタを移動しますか?

簡単な質問、

Freadを使用する場合:

fread(ArrayA, sizeof(Reg), sizeBlock, fp);

私のファイルポインタ、fpは先に移動しますか?

17
Richard

Answer:はい、ファイルポインタの位置は読み取り操作後に自動的に更新されるため、連続するfread()関数は連続するファイルレコードを読み取ります。

説明:fread()はブロック指向の関数です。標準のプロトタイプは次のとおりです。

_size_t fread(void *ptr,
             size_t size,
             size_t limit,
             FILE *stream);
_

この関数は、streamが指すストリームから読み取り、読み取ったバイトをptrが指す配列に配置します。次の条件のいずれかが当てはまると、読み取りを停止します。

  • サイズlimitsize要素を読み取った、または
  • ファイルの終わりに達する、または
  • 読み取りエラーが発生します。

fread()は、fgetc()と同じくらい多くの制御を提供し、1回のI/O操作で複数の文字を読み取ることができるという利点があります。実際、メモリが許せば、ファイル全体を配列に読み込み、すべての処理をメモリ内で実行できます。これには、パフォーマンス上の大きな利点があります。

fread()は、固定長のデータレコードを構造体に直接読み取るためによく使用されますが、任意のファイルを読み取るために使用できます。ほとんどのディスクファイルを読み取るための私の個人的な選択です。

25
Addicted

はい、freadを呼び出すと、実際にファイルポインタが移動します。ファイルポインタは、実際に読み取られたバイト数だけ進められます。 freadでエラーが発生した場合、freadを呼び出した後のファイルの位置は指定されていません。

29
David Heffernan

はい、fpは読み取られた合計バイト数だけ進められます。
あなたの場合、関数freadは、sizeBlockが指すストリームから各sizeof(Reg)バイト長のfpオブジェクトを読み取ります。 、ArrayAで指定された場所に保存します。

2
Jainendra

はい、そうです。 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;
}
0
felipsmartins