2015-06-07 54 views
0

我嘗試從stdin讀取文件,十六進制值:用fread C時的讀數二進制文件()

0X0A

爲0x00 0X0A

0x61爲0x00 0x61爲0x00 0X0A

0×00 0×00 0×00

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

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

+2

它確實有助於瞭解「tab」是什麼以及它是如何聲明的。我認爲這是崩潰的地方,而不是最後一行的「i ++」。 –

+0

這是所有的代碼?看看'tab'的定義。 – cybersoft

+0

你有足夠的尺寸'tab'嗎? – BLUEPIXY

回答

1

沒有看到tab的聲明,我們無法確定觸發段錯誤的可能性(最有可能超出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)檢查是否已達到文件結尾。