[英]Data get lost when written to binary file - C++
我有一個包含 4994 個向量的數組。 我想將數組以二進制格式保存在文件中。 由於我不習慣這樣做,我做了一個測試,看看數組是否成功復制到文件中。 所以,我首先將數組保存在一個文件中,然后從該文件加載數組。 比較數據,我發現它們在特定點之后有所不同:
vec3* points = new vec3[4994];
vec3* pointsRead = new vec3[4994];
//
//Adding data in 'points'...
//
//Write 'points' in binary file
std::ofstream suzannePointsFile("suzannePoints.data", std::ios_base::binary);
suzannePointsFile.write((char*)points, sizeof(vec3) * 4994);
//Read 'points' into 'pointsRead'
std::ifstream suzanneRead("suzannePoints.data", std::ios_base::binary);
suzanneRead.read((char*)pointsRead, sizeof(vec3) * 4994);
for (int i = 0; i < 4994; i++) {
if (points[i] != pointsRead[i]) {
//When debugging, the if statement is true when i>=4778.
//Meaning that the data is different from this point on.
}
}
我認為寫入或讀取功能有問題。 所以我嘗試將他們的第二個參數 (sizeof(vec3)*4994) 替換為一些隨機更大的數字,這就是發生的事情:
這對我來說毫無意義。 有任何想法嗎?
對使用 C++ 標准庫的文件操作進行緩沖。 原因是寫入與程序員要求的一樣多的字節可能非常低效。 例如,旋轉硬盤驅動器或 SSD 驅動器不能寫入單個字節,而只能寫入 4096 字節的塊。 因此,如果您想寫入單個字節,則必須讀取包含它的 4096 字節塊,更改要寫入的一個字節,然后寫入整個 4096 字節塊。
如果你寫一整兆字節,一個字節一個字節,你可以看到每個字節都需要讀取一個 4096 字節的塊,然后寫入這樣一個塊。 為了解決這個問題,C ++標准庫中收集數據,而當足夠多的數據被收集,然后將其寫入數據。 當文件關閉時,其余的數據將被寫入。
您調用 .write 來寫入 x 字節。 結果是實際寫入的字節數少於 x 字節,如果您編寫另一個向量或關閉文件,則其余的將被寫入。 您沒有這樣做,然后為同一文件打開了另一個流。 問題是您的 x 字節尚未寫入,因此無法讀取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.