簡體   English   中英

寫入二進制文件時數據丟失 - C++

[英]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) 替換為一些隨機更大的數字,這就是發生的事情:

  • 用 5100 替換 4994 時,我遇到了完全相同的問題。 i=4778后數據不同。
  • 用5200替換4994時,數據全部傳輸成功。

這對我來說毫無意義。 有任何想法嗎?

對使用 C++ 標准庫的文件操作進行緩沖。 原因是寫入與程序員要求的一樣多的字節可能非常低效。 例如,旋轉硬盤驅動器或 SSD 驅動器不能寫入單個字節,而只能寫入 4096 字節的塊。 因此,如果您想寫入單個字節,則必須讀取包含它的 4096 字節塊,更改要寫入的一個字節,然后寫入整個 4096 字節塊。

如果你寫一整兆字節,一個字節一個字節,你可以看到每個字節都需要讀取一個 4096 字節的塊,然后寫入這樣一個塊。 為了解決這個問題,C ++標准庫中收集數據,而當足夠多的數據被收集,然后將其寫入數據。 當文件關閉時,其余的數據將被寫入。

您調用 .write 來寫入 x 字節。 結果是實際寫入的字節數少於 x 字節,如果您編寫另一個向量或關閉文件,則其余的將被寫入。 您沒有這樣做,然后為同一文件打開了另一個流。 問題是您的 x 字節尚未寫入,因此無法讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM