私はこれについて広範囲にグーグルで検索しましたが、現在4時間立ち往生しています。誰かが私を助けてくれることを願っています.
約 2.7 MB のバイナリ ファイルを読み取る簡単なプログラムがあります。プログラムは、tcc コンパイラを使用して Windows でコンパイルされます。私はさまざまな高級言語 (Pascal、Modula2、Matlab、PHP、Basic) の経験がありますが、C は初めてで、これはメモリ割り当てと変数の上書きに関係していると思われます。
void main ()
{
long int start_loc;
long int actual_loc;
int seek_result;
char file_to_process[]="d:/tmp/pfc/test.out";
char read_int;
int spaces;
int read_result;
FILE *data_file;
//fpos_t position;
data_file=fopen(file_to_process,"r");
if (data_file == NULL) {
printf("Error");
}
start_loc = 1002;
printf("\n size of start_loc : %d",sizeof(start_loc));
actual_loc = ftell(data_file);
printf("\nBEFORE location %d \n",actual_loc);
seek_result = fseek(data_file, start_loc, SEEK_SET); //move to start of search location in the file
actual_loc = ftell(data_file);
printf("\n AFTER seek location %d \n",actual_loc);
fread(&read_int, 1, 1, data_file);
actual_loc = ftell(data_file);
printf("\n AFTER read location %d \n",actual_loc);
printf("\n read result %x" ,*&read_int);
fread(&read_int, 1, 1, data_file);
actual_loc = ftell(data_file);
printf("\n AFTER read location %d \n",actual_loc);
printf("\n read result %x" ,*&read_int);
fclose(data_file);
return;
}
上記の例では、ファイルの 1002 番目の場所から読み取ります - これは正常に動作します - 結果は次のとおりです。
size of start_loc : 4
BEFORE location 0
AFTER seek location 1002
AFTER read location 1003
read result 0
AFTER read location 1004
read result 3
すべてが期待どおりに機能します。ファイル ポインタは、読み取られたバイトごとに 1 文字ずつ進みます。
問題は、開始場所の値などで発生します。
start_loc = 16000
この場合、コマンド egie read 1 バイトの後に、ファイル ポインタが一見ランダムな方法でジャンプし、ファイル ポインタが 19586 に移動します。
size of start_loc : 4
BEFORE location 0
AFTER seek location 16000
AFTER read location 19585
read result 47
AFTER read location 19586
read result 0
ここまで読んでくれてありがとう!