1

double私は、 3列に分割された数千行の数字(分子動力学出力からの、タイプである必要があります)でいっぱいのテキストファイルを持っています:

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

doubleファイル内のすべての数値を読み取り、それらをタイプに変換してからファイルに保存したいと思いbinaryます。バイナリファイルは推奨されないことは知っていますが、テキストとバイナリの両方のファイル形式で圧縮アルゴリズムをテストしたいと思います。txtファイルをC++でバイナリファイルに変換する必要があることを試しましたが、各数値を全体の形式で変換するのか(-11.275804)、または個々の数値を解析するのか(-1,1,2,7,5)がわかりません。 、など。

編集:シングルダブルをバイナリに変換して元に戻そうとしてきましたが、いくつかの問題があります。これがコアコードです

    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つだけ読み取る場合、たとえば1.23456789、読み取った文字列の長さは7です。

read a double: 1.23457

次の「スペース」まで読み取ってから、double->binに変換したいと思います。バイナリ->テキスト変換を行うと、すべてが壊れてしまいます。バイナリを処理して、doubleに変換してからstringに変換する方法がわかりません。

更新:最後に、バイナリ変換がod -lFユーティリティで機能していることを確認しましたが、各行に、それが何を意味するのかわからない奇妙な行があります。最初の数値からゼロが切り取られ、代わりに2列に出力されます。の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 に答える