2017-06-26 54 views
0

基本上我有一個包含數字的文本文件。我將數字更改爲0開始,然後從文件中讀取2個字節(因爲int爲2個字節),並將其轉換爲int。然後我打印結果,但它打印出奇怪的結果。從一個文件讀取2個字節並轉換爲一個int給出錯誤的輸出

所以當我有0時,打印2608出於某種原因。

我正在關閉一個文檔,說我需要讀取一個文件,其中字節0到1的偏移量表示一個數字。所以這就是爲什麼我要讀取字節而不是字符的原因...

我想這個問題是由於閱讀字節而不是字符讀取,所以如果是這種情況,請你解釋爲什麼它會有所作爲?

這裏是我的代碼:

void readFile(FILE *file) { 
    char buf[2]; 
    int numRecords; 

    fread(buf, 1, 2, file); 

    numRecords = buf[0] | buf[1] << 8; 

    printf("numRecords = %d\n", numRecords); 
} 

我真的不知道什麼是BUF [0] | buf [1] < < 8沒有,但我從另一個問題得到了......所以我想這也可能是問題。

+1

決定你的想法。要麼你有一個文本文件,要麼你有一個帶有2字節二進制整數的文件。不是在同一時間。 – EJP

+0

@EJP我完全消隱並忘記我的int將以ASCII形式。 – Logan

回答

3

您的文本文件中的數字0實際上將表示爲一個1字節的十六進制數0x300x30加載到buf[0]。 (在ASCII表00x30表示)

您在buf[1]有垃圾數據,在這種情況下,值是0x0a。 (0x0a\n在ASCII表)

0x0a30這是十進制2608結合這兩個由buf[0] | buf[1] << 8結果。請注意,<<是按位左移運算符。

(另外,int類型的大小是在許多系統中4個字節,你應該檢查了這一點。)

+0

感謝您的快速回復。有沒有另外一種方式,我可以以某種方式將int的實際字節寫入文件,以便我可以測試我的程序? – Logan

+0

嘗試'fprintf(file,「%d」,numRecords)''。這會將'int'轉換爲相應的文本。如果你想寫實際的字節,你可以做'fwrite'。 – nglee

+0

所以我嘗試使用fprintf(文件,「%d」,numRecords)然後我在輸出上運行我的代碼,它現在打印出48 ...你認爲這是readFile()的問題嗎? – Logan

0

您可以直接讀入整數

fread(&numRecords, sizeof(numRecords), 1, file); 

您需要檢查sizeof(int)上你的系統,如果你的四個字節需要聲明numRecordsshort int而不是int

相關問題