2015-09-23 27 views
-2

我有20個數字的數組。我正在嘗試將每個數字添加到數組中,但我正在使用二進制。我以二進制形式做這件事的原因是因爲我正在努力爲明天的考試做好準備。這是我的代碼。爲什麼使用寫入函數而不是整數將奇怪的符號寫入二進制文件?

file.open(fileName, ios::out | ios::binary); 
for (int number = 0, index = 0; index < 20; index++) { 
    number = numbers[index]; 
    if (!file.eof()) { 
     file.write(reinterpret_cast<char *>(&number), sizeof(number)); 
    } else { 
     break; 
    } 
} 

文本文件的輸出是: 「$ 1 @Qdyꩃ·迪!」

爲什麼?我知道該數組已填充,因爲我使用了一個cout語句來查看其中的內容。我也知道用於獲取數字的變量的工作原理是因爲我使用了cout來查看它是否正確地從數組中獲取值。

+1

因爲你寫的東西不是文本,所以當解釋爲文本時,它看起來像垃圾? – immibis

+0

數字怎麼不是文字?我不允許在二進制模式下將整數寫入文本文件嗎? –

+1

你在想'reinterpret_cast'將int轉換爲文本嗎?因爲它沒有。而'int'是一個二進制值,而不是一系列字符。所以你正在寫這個二進制數據。 – TheUndeadFish

回答

2

當您以二進制模式將整數寫入文件時,您也應該以二進制模式讀取它們。文本編輯器不能這樣做。此外,數據將以系統特定的方式寫入,即首先是最低有效字節或最高有效字節。文本編輯器會將這些數字重新解釋爲字符,因此您會看到「垃圾」輸出。

檢查eof()沒有必要當你該文件,所以你可以從你的代碼中刪除它。

file.open(fileName, ios::out | ios::binary); 
for (int number = 0, index = 0; index < 20; index++) { 
    number = numbers[index]; 
    file.write(reinterpret_cast<char *>(&number), sizeof(number)); 
} 

要確保你寫的正確數據,寫一個小程序,從以二進制方式讀取文件,並打印數字爲整數。您將看到numbers[]陣列中的數字。

+1

我不會使用術語「二進制模式」,因爲問題是格式化輸出與寫入字節數組,而不是在二進制模式與文本模式下打開文件。 – Hurkyl

+0

嗯,我試圖從它讀取,但它不斷崩潰。它在.read行上崩潰。它說:「以類型std :: __ 1 :: ios_base :: failure:ios_base :: clear:未指定的iostream_category錯誤」未捕獲的異常終止。我在Google上找到的其他示例中使用了相同的設置。我把它重新打開爲file.open(fileName,ios :: in | ios :: binary) –

+0

@JozemiteApps你是否得到它的工作?從不同的程序嘗試這個。您應該可以通過一次調用read來讀取整個數組,並傳遞20個元素的數組及其sizeof。 – dasblinkenlight

相關問題