22

簡単な質問、

freadを使用する場合:

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

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

4

4 に答える 4

33

回答:はい。ファイルポインタの位置は読み取り操作後に自動的に更新されるため、連続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()多くの場合、固定長のデータレコードを構造体に直接読み込むために使用されますが、任意のファイルを読み込むために使用できます。これは、ほとんどのディスクファイルを読み取るための私の個人的な選択です。

于 2012-05-22T06:35:25.280 に答える
30

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

于 2012-05-22T06:32:11.220 に答える
2

はい、fp読み取られたバイトの合計量だけ進められます。
あなたの場合、関数freadは、によってポイントされたストリームからsizeBlock各バイト長のオブジェクトを読み取り、によって指定された場所にそれらを格納します。sizeof(Reg)fpArrayA

于 2012-05-22T06:36:34.607 に答える
1

はい、そうです。現在の位置(実際には、これまでに読み取られたバイト)を表示するために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;
}
于 2017-07-08T17:19:29.317 に答える