2010-12-14 31 views
2

我想在一個特定的從文件中讀取偏移(簡體版)EOF返回true:FEOF()的時候沒有達到

typedef unsigned char u8; 
FILE *data_fp = fopen("C:\\some_file.dat", "r"); 
fseek(data_fp, 0x004d0a68, SEEK_SET); // move filepointer to offset 
u8 *data = new u8[0x3F0]; 
fread(data, 0x3F0, 1, data_fp); 
delete[] data; 
fclose(data_fp); 

的問題變得,該數據將不包含1008個字節,但529(似乎是隨機的)。當它達到529字節時,對feof(data_fp)的調用將開始返回true。

我也嘗試讀取較小的塊(一次8個字節),但它看起來像是在EOF尚未存在時觸及EOF。

十六進制編輯器中的簡單外觀顯示there are plenty of bytes left

+0

@pmg,使用malloc/free不會解決我的問題,但適合自己:) – 2010-12-14 16:20:20

+1

在C(我不知道C++)我會嘗試以二進制模式打開文件 – pmg 2010-12-14 16:21:38

+0

@pmg,該死!就這麼簡單...請創建一個答案,我會接受它。 – 2010-12-14 16:24:26

回答

4

以文本模式打開文件,就像您在做的一樣,會使庫將某些文件內容轉換爲其他內容,可能會觸發不必要的EOF或錯誤的偏移量計算。

打開通過將「B」選項,而fopen的調用

fopen(filename, "rb"); 
1

文件是否被某些其他應用程序並行寫入?也許存在競爭條件,以便文件在讀取停止的地方結束,當讀取正在運行時,但稍後當你檢查它時,其餘部分已經被寫入。這也可以解釋隨機性。

+0

不!它正在被另一個應用程序讀取,但關閉它,甚至複製文件,改變路徑給了我相同的結果......奇怪的是隨機數(529)每次都是一樣的 – 2010-12-14 16:22:35

1

在二進制模式的文件也許是文本和二進制文件之間的差異。如果你在Windows上,換行符是CRLF,它是文件中的兩個字符,但在讀取時轉換爲只有一個字符。嘗試使用fopen(...,「rb」)

0

我看不到您的工作鏈接,但如果您的計算機聲稱沒有更多字節存在,我傾向於相信它。爲什麼不打印文件的大小,而不是在十六進制編輯器中手動操作?

另外,你最好使用2級I/O f-calls是古代的,而你使用C++,因爲你有新的。

int fh =open(filename, O_RDONLY); 
struct stat s; 
fstat(fh, s); 
cout << "size=" << hex << s.st_size << "\n"; 

現在做你的追求,並使用2級I/O調用,這是無論如何快讀,讓我們來看看文件的大小真的是什麼。

+0

在大多數情況下,f-調用速度更快,因爲它們是緩衝的,而低層則是無緩衝的。在這種情況下,這並不重要,因爲只有一次讀取。 – 2010-12-14 17:41:58

+0

如果你想要速度,不要使用舊的,有層層疊疊的垃圾的C層。如果你正在做大量的讀取,你需要一個高性能的緩衝類,是的。 – Dov 2010-12-14 18:31:48

相關問題