簡體   English   中英

寫入和讀取浮點數到二進制文件時的不同值

[英]Different values when writing and reading floats to binary file

我有一段代碼,將一些浮點數寫入二進制文件,然后將其讀回。 讀取的數據與寫入的數據不同。

為什么會這樣? 可以解決嗎? 這是我的代碼:

#include <fstream>
using namespace std;

int main ( int argc, char *argv[] )
{
    float a[3];
    float b[3];
    a[0] = 0.3721548;
    a[1] = 0.3721548;
    a[2] = 0.3475495;

    ofstream file("mlt_data", std::ios::binary);
    file << a[0];
    file << a[1];
    file << a[2];
    printf("write: \t%.7f %.7f %.7f\n", a[0], a[1], a[2]);
    file.close();

    ifstream file2("mlt_data", std::ios::binary);
    file2 >> b[0];
    file2 >> b[1];
    file2 >> b[2];
    printf("read: \t%.7f %.7f %.7f\n", b[0], b[1], b[2]);
    file2.close();
    return 0;
}

這是輸出:

write:  0.3721548 0.3721548 0.3475495
read:   0.3721550 0.3721550 0.3475490

盡管以二進制模式打開文件,但是當使用>> -和<< -運算符時,實際上是將數據“序列化”為文本表示形式。 在數據類型float上使用<<時,默認情況下將其值舍入為6的精度。因此,您在寫入時會“松散”精度/信息,稍后在文本浮點表示中進行讀取時無法重現。 因此,輸出的差異是由於以下事實:寫入文件的值四舍五入至6位數字,而您以7的精度printf這些值。

為了證明確實如此,請測試將<< -precision設置為7(在實際寫入值之前):

file << std::setprecision(7);

但是實際上您應該以二進制格式編寫數據:

file.write((const char*)a, sizeof(a));
...
file2.read((char*)b,sizeof(b));

使用標志std::ios::binary更改將換行符寫入和讀取文件的方式。 有關更多詳細信息,請參見http://en.cppreference.com/w/cpp/io/c#Binary_and_text_modes

它不會更改格式化輸入和輸出的寫入/讀取方式。

如果要保留數字的准確性,請使用ostream::writeistream::read

ofstream file("mlt_data", std::ios::binary);
fire.write(reinterpret_cast<char const*>(a), sizeof(a));
printf("write: \t%.7f %.7f %.7f\n", a[0], a[1], a[2]);
file.close();

ifstream file2("mlt_data", std::ios::binary);
file2.read(reinterpret_cast<char*>(b), sizeof(b));
printf("read: \t%.7f %.7f %.7f\n", b[0], b[1], b[2]);

暫無
暫無

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

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