Fread関数を使用する:読み取り可能なサイズは読み取り可能なものより大きい
-
13-12-2019 - |
質問
私は質問をしています:
ファイルを読むために仲間を使っています。
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);
.
ループを使用して、この呼び出しを連続して呼び出して、ファイル全体を読むようにします。
ファイルの終わり近くに入ったとき、私は「サイズ」* sizeof(reg)を読むことができない、またはあなたがこの金額の半分を読むことだけが利用可能であるならば、私の配列Aで何が起こるのかを読んでください。完成しますか?関数はエラーを返しますか?
フレッドによるファイルの読み取り方法を知っていますか?
EDI1:厳密には、区分が正確ではない場合は、最後のビットの小さいファイルサイズを読んでいる場合、私は自分のベクトルのサイズが私のベクトルのサイズ変更を疑問に思います。動的より良いものを読み、または開発することができます。
解決
読み込んだレコード数を返します。あなたのバッファーのそれを超えたものは何でも閉じ込められているかもしれません、そのデータに頼らないでください。
Freadは実際に読み取られた全項目の数を返します。 エラーが発生した場合、またはファイルの末尾がある場合よりも少ない カウントに達する前に遭遇しました。
ファイルの末尾を過ぎて読み込まれません。長さ。
あなたの論理はこれに対応する必要があります - ファイルサイズはあなたに予想されるレコード数を与えるので、初期化されていないレコードに対応するバッファ内の末尾データを無視することは難しくありません。「読み取られたレコード」カウンターは1つのアプローチです。
他のヒント
fread()
読み込んだ要素の数を返します。したがって、fread()
の戻り値を確認して、配列内の要素の数を有効にする必要があります。
エラーが発生したか、またはEOF
がある場合は、短い項目数またはゼロを返します。この場合、feof()
OND ferror()
を使用して、どの条件が満たされるかを確認する必要があります。