[英]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
訪問范圍)。
但是,你不應該使用fread
與stdin
- 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.