2012-11-19 15 views
2

我試圖檢測文件中的最後一個字節是否爲control-z (the MS-DOS originating end of file byte - 0x1A),但我沒有取得任何成功。我使用如何在C語言編程語言中檢測Ctrl-z文件標記的結尾

fseek(filePointer,-1,SEEK_END); 

到最後一個字節隔離,然後我用

fread(buffer, sizeof(buffer[0]), sizeof(custom_char), filePointer); 

嘗試讀取的最後一個字節。

我基本上得到垃圾時,我嘗試讀取該字節,我想知道如果fread可能會忽略默認的0x1A字節,或者如果在執行此操作時人們在過去遇到過其他任何其他古怪行爲。

目前的邏輯,這是故障,試圖讀取最後一個字節,並考慮文件標誌的結尾處找到,如果FREAD返回0(FREAD應該返回讀取元素的數量,對吧?):

if(fread(buffer, sizeof(buffer[0]), sizeof(custom_char), filePointer) == 0) 
{ 
    // strip off the last byte 
} 

編輯: 我應該補充說,在調用fopen之後出現了問題,寫入了BOM,並且BOM的第3個字節被錯誤地認爲是文件標記的0xA1結尾並被剝離。

+1

當你調用'fopen'時,你是否指定'b'(二進制)作爲'mode'參數的一部分? – ChrisW

+0

@ChrisW不,我正在閱讀和編寫文本文件。使用UTF-8標誌。 – Stubbs

+1

Ctrl + Z是一箇舊的CP/M約定,因爲它只能計算扇區而不是字節。在utf-8編碼文件中找到一個是恐龍與人類電影中的時間不合時宜。但是,是的,當您以文本模式打開文件時,fread()已經過濾它。 –

回答

3

您需要打開二進制模式的文件:

FILE *filePointer = fopen("yourfile.txt", "rb"); 

否則文件將在文本模式下打開,這將CR-LF字符對轉換爲C「\ n」字符,並擺脫EOF的字符,在Windows/MSDOS上。

+0

不幸的是,在我的代碼中,我已經在條件語句內部確保模式是「a」或「a +」而不是二進制。我真的只是想抓住文件的最後一個字節(char)。 – Stubbs

+0

@Stubbs:然後,您必須通過以二進制模式重新打開文件來將檢測作爲單獨步驟進行。這是正確的答案。 –

+0

@Adrian McCarthy謝謝你的幫助。 – Stubbs