簡體   English   中英

C用fread()讀取二進制文件

[英]C Reading binary file with fread()

我試圖從具有十六進制值的標准輸入中讀取文件:

0X0A

0x00 0x0a

0x61 0x00 0x61 0x00 0x0a

0x00 0x00 0x00

int i = 0;
unsigned char x = 0;        
            while(x != 0x0a && x != EOF){
                fread(&x, 1 , 1, stdin);
                tab[i] = x;
                i++;
            }

有了這個循環,我得到最后一行的分段錯誤。

在沒有看到tab的聲明的情況下,我們無法真正確定是什么觸發了segfault(很可能是超出對tab訪問范圍)。

但是,你不應該使用freadstdin - fread是用於讀取二進制文件,它會在屏幕上閱讀每個字符的二進制表示。 實際上,您正在讀取字符的字節表示形式,與執行x = getchar()scanf("%c", &x)幾乎相同

因此,您將看到“ 0x0a \\ n0x00 0x0a \\ n”等。

現在,您正在針對0x0a值(實際上是'\\n' ,因此您可能沒有讀過第一行。

您想做的是:

scanf("0x%x", &x);

它將讀取單個十六進制值,例如“ 0x0a”,然后您可以根據上面的常數進行檢查。

另一件事-您已將x聲明為unsigned char ,但正在針對EOF (即int -1 我很驚訝編譯器沒有向您發出警告。 您應該幾乎總是將值讀入int,因此我將其重新聲明為int

同樣,在讀取二進制文件時(即使用fread ),您將永遠不會讀取EOF值,因為該值是在文件中可以找到的有效值。 相反,如果已到達文件末尾,則fread將返回0。您可以使用feof(file)檢查是否已到達它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM