3

質問があります:

fread を使用してファイルを読み取っています。

typedef struct {
    int ID1;
    int ID2;
    char string[256];
} Reg;

Reg *A = (Reg*) malloc(sizeof(Reg)*size);

size = FILESIZE/sizeof(Reg);

fread (A, sizeof(Reg), size, FILEREAD);

ループを使用してこの呼び出しを連続して呼び出し、ファイル全体を読み取らせます。

ファイルの終わり近くに来て、"size" * sizeof (Reg) を読み取れない場合、またはこの量の半分しか読み取ることができない場合、配列 A はどうなりますか。完了?関数はエラーを返しますか?

ファイルがフレッドスルーによってどのように読み取られたかを知っていますか?

Edi1:正確に、分割が正確でない場合、ファイルにないものを読み取る最後の少し小さいファイル サイズを読み取るときに、読み取り可能なバイト数にベクトルのサイズを変更することを考えています。またはより良いダイナミクスを開発します。

4

2 に答える 2

8

freadは、読み取ったレコード数を返します。バッファ内のそれを超えるものはすべて破損する可能性があります。そのデータに依存しないでください。

fread は、実際に読み取られた完全なアイテムの数を返します。エラーが発生した場合、または count に達する前にファイルの終わりに達した場合は、count より少なくなることがあります。

この関数はファイルの末尾を超えて読み取りません。最も可能性の高いのは、ファイル サイズがバッファー長の正確な倍数でない限り、一連の完全なバッファーを取得してから (最終) 部分バッファーを読み取ることです。

ロジックはこれに対応する必要があります。ファイル サイズから予想されるレコードの合計数が得られるため、fread初期化されていないレコードに対応するバッファ内の末尾のデータを無視することは難しくありません (最後の呼び出しの後)。「読み取りが残っているレコード」カウンターは、1 つのアプローチです。

于 2012-05-22T15:30:33.740 に答える
1

fread()読み取ることができた要素の数を返します。fread()したがって、配列内の有効な要素の数を確認するには、の戻り値を確認する必要があります。

エラーが発生した場合、またはEOF到達した場合は、短いアイテム数またはゼロを返します。この場合、どの条件が満たされているかを確認するには、feof()ondを使用する必要があります。ferror()

于 2012-05-22T15:33:25.343 に答える