1

【分かりやすく書き直しました】

double常に同じ文字数の形式で、ファイルとの間で s を読み書きする必要があります。形式は人間が読める形式である必要はありません: 読み込みが速くなければなりません (動的メモリと変換要素をできるだけ少なくし、ファイル スペースは重要ですが、それほど重要ではありません)。

a のコンポーネントを取得する標準的な (または少なくとも安全で信頼できる) 方法はありdoubleますか?'1''0'

基本的に、double から特定のビット/数値コンポーネントを取得するにはどうすればよいですか? 別のシステムでこれを行うことさえ可能ですか (Windows などの同じ OS ファミリを想定)、またはdoubles のコンポーネントの標準は OS ごとに強制されていませんか?

私は MinGW を使用しており、もちろん Windows 用にコンパイルしています。可能であれば、C++ 標準ライブラリではなく、C 標準ライブラリを使用したいと考えています。また、他のライブラリ (Boost など) は避けたいと思いますが、特定の Windows 機能があれば、それらは大いに役立ちます。

4

3 に答える 3

1

これを行う最も直接的な方法は、バイナリ モードで fstream を開き、fstream の write() メソッドと read() メソッドを使用して、ストリームとの間で double を読み取ることです。

#include <fstream>
#include <iostream>

int main( int argc, char** argv ) {
    std::fstream fp( "foo", std::fstream::in |
                            std::fstream::out |
                            std::fstream::trunc |
                            std::fstream::binary );

    double d1, d2;

    d1 = 3.14;

    fp.write( (char*)&d1, sizeof( d1 ) );
    fp.seekg( 0, std::fstream::beg );
    fp.read( (char*)&d2, sizeof( d2 ) );

    std::cout << "d1 = " << d1 << "  d2 = " << d2 << std::endl;
}
于 2013-08-30T04:06:13.853 に答える
0

これは非常に単純な例ですboost::serializer( http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/index.html )。と を使用boost::archive::text_iarchiveしていますが、とboost::archive::text_oarchiveに切り替えることができます。動作するはずです。boost::archive::binary_iarchiveboost::archive::binary_oarchive

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <sstream>
#define _USE_MATH_DEFINES
#include <cmath>

using namespace std;

int main()
{

    double a = M_PI;
    string text;

    {
        ostringstream textStream;
        boost::archive::text_oarchive oa(textStream);
        oa << a;
        text = textStream.str();
    }
    cout << "a: " << text << endl;
    double b;
    {
        istringstream textStream(text);
        boost::archive::text_iarchive ia(textStream);
        ia >> b;
    }
    cout << "b: " << b << endl;
}

出力:

a: 22 serialization::archive 9 3.1415926535897931
b: 3.14159
于 2013-08-31T22:58:15.187 に答える
0

おそらく、次のようなものが必要です。

#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;

template <typename T>
string convertToHex(const T &x)
{
    char *xc = (char *)&x;
    ostringstream s;
    for (char *c = xc; c < xc + sizeof(x); ++c)
        s << hex << setw(2) << setfill('0') << static_cast<int>(*c) << " ";
    return s.str();
}

template <typename T>
void convertFromHex(string s, T &x)
{
    char *xc = (char *)&x;
    istringstream is(s);
    for (char *c = xc; c < xc + sizeof(x); ++c)
    {
        int tmp;
        is >> hex >> tmp;
        *c = tmp;
    }
}

int main()
{
    double a = 10;
    string as = convertToHex(a);
    cout << "a: " << as << endl;
    double b;
    convertFromHex(as, b);
    cout << "b: " << b << endl;
}

出力:

a: 00 00 00 00 00 00 24 40 
b: 10
于 2013-08-30T03:33:55.477 に答える