我已經爲此進行了廣泛搜索,現在花了4個小時,我希望有人能幫助我。Windows/TCC/C讀取隨機跳轉的二進制文件指針
我有一個簡單的程序來讀取一個二進制文件,大約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
在這種情況下,文件指針例如命令後跳躍一個看似隨機的方式即讀取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
感謝您閱讀這篇文章!
如果你不想說「這不是真正的隨機!」的話,避免說「隨機跳躍」。 – OJFord
除非我誤解了你想要達到的目標,'size_of(start_loc)'並沒有按照你的想法去做。這給你'start_loc'類型(long int)的內存大小。 – OJFord
是的,這是正確的 - 我很困惑發生了什麼我想檢查它真的是4個字節長,因此可以保持文件指針值高達2^32之後,因爲你說它什麼都不做 – rubusrubus