0

ファイルがあります。ファイルのサイズを読みました。次に、ファイルの最後に到達するまで、一度に 2 バイトの読み取りをループします。すべての読み取り操作の後、現在の位置を 2 ずつインクリメントしますが、ファイルのサイズが半分になった後、位置はインクリメントされず、fread 操作は 0 バイトを読み取ります。

プログラムはファイルサイズを読み取ります。現在の位置がファイルのサイズと等しくなるまで、fread (毎回 2 バイト) を実行します。ファイルサイズに対して22915バイトを読み取ります。読み取りごとに位置を2ずつ増やしますが、現在の位置がファイルのサイズの半分である11459に達すると、ゼロバイトが読み取られるため、無限ループに入ります。

FILE *file;
char *file_name;
int readCount = 0;
int position = 0;
int fileSize;
unsigned short mem_accesses;

file_name = "sample.txt";

/** open the file */
file = fopen(file_name, "rb");
fseek(file, 0, SEEK_END);
fileSize = ftell(file);
rewind(file);


while(position<fileSize){
   mem_accesses = getNumberAccesses();
   printf("position: %d filesize: %d\n",position, fileSize);

}

unsigned short getNumberAccesses(){
/** calculate number of accesses for process */
unsigned short val;

readCount = fread(&val, sizeof(val), 2, file);

position += readCount;
printf("read count: %d\n", readCount);

return val;
}
4

2 に答える 2

8
readCount = fread(&val, sizeof(val), 2, file);  

このステートメントは、それぞれ 2 バイトの 2 つの項目を読み取ります。そして、読み取ったアイテムの数として値2を返します。2 番目と 3 番目のパラメーターを乗算するとfread、読み取るバイト数がわかります。

于 2009-12-03T23:38:01.893 に答える
1

fread は、バイト数ではなく、読み取った要素の数を返します。

(ちなみに、あなたのコードでは、誤って要素数を 2 に指定しており、バッファ オーバーフローが発生しています)。

エラーが発生した場合に無限ループに陥らないように、fread の戻り値を確認する必要があります。

ファイル サイズを照会する代わりに、ファイルの終わりまでループ内で fread (または他の入力関数) を呼び出すだけです。

于 2009-12-03T23:38:54.560 に答える