1

我有一个充满数字的文本文件(来自分子动力学输出,应该是 type double)分为三列,有数千行,如下所示:

    -11.979920  -13.987064   -0.608777
     -9.174895  -13.979109   -0.809622

我想读取文件中的所有数字,将它们转换为类型double,然后将它们保存到binary文件中。我知道不推荐使用二进制文件,但我希望它测试两种文件格式的压缩算法,即文本和二进制文件。我曾尝试使用需要将 txt 文件转换为 C++ 中的二进制文件,但我不确定是否将每个数字转换为其整个格式:-11.275804 或者它是否正在解析每个单独的数字:-1、1、2、7、5 , ETC..

编辑:一直在尝试将单个双精度转换为二进制并返回,存在一些问题。这是核心代码

    if( std::string(argv[1]) == "-2bin")  //convert to binary
{
    cout << "Performing the conversion: Text -> Binary..." << endl;
    std::ifstream in(argv[2]);
    std::ofstream out(argv[3], std::ios::binary);
    double d;

    while(in >> d) {
        cout << "read a double: "<< d <<endl;
        out.write((char*)&d, sizeof d);
    }
    out.flush();
    out.close();

    cout << "Conversion complete!" << endl;
    return 0;
}else if( std::string(argv[1]) == "-2text" ) //convert to text
{
    cout << "Performing the conversion: Binary -> Text..." << endl;
    std::ifstream in(argv[2], std::ios::binary);
    std::ofstream  out(argv[3]);
    std::string s;

    while(in >> s) {
        cout << "read a string:" << s <<endl;
        out.write((char*)&s, s.length());
    }
    out.flush();
    out.close();

    cout << "Conversion complete!" << endl;
    return 0;

仅读取一个双精度时,例如1.23456789读取的字符串长度为 7

read a double: 1.23457

我希望它读取到下一个“空格”,然后转换为 double->bin。在进行二进制-> 文本转换时,一切都被破坏了,我不知道如何处理二进制并将其转换为双精度然后是字符串。

更新:最后我设法检查二进制转换是否与od -lF实用程序一起使用,但是每一行都有一个奇怪的行,我不知道它是什么意思,它从第一个数字中减去零,输出改为两列3:

od -lF composite_of10_2.bin | more
0000000     -4600438323394026364     -4599308401772716498
                       -11.97992               -13.987064
0000020     -4619713441568795935     -4602017412087121980
                       -0.608777                -9.174895
0000040     -4599312880039595965     -4617904390634477481
                      -13.979109                -0.809622

这看起来是否正确转换?我应该如何执行从二进制到双字符串的转换?

4

1 回答 1

2

在您的二进制 -> 文本转换中,您将数据作为“字符串”读取,而二进制文件包含二进制“双精度”

std::string s;

    while(in >> s) { ...

这将给出未定义的结果,您需要以 'double' 的形式读入并将值转换为字符串,这将由文本输出流本地处理

double d;
while( in.read( (char*)&d, sizeof(d) ) { //, Read the double value form the binary stream
    out << d << ' '; //< Write the double value to the output stream which is in text format
}
于 2013-01-29T15:17:35.473 回答