0

私はmpz_classを使用しています(Visual Studio C ++2010でMPIR2.5.1を使用し、MPIRのC ++バージョンを使用しています)。私にとっては、メモリに膨大な数を格納することはできないため、バイナリファイルで実行したいと思います。

私はすでにこれをテキストファイルで終了しましたが、100,000以上のビット数を使用すると、バイナリファイルは(うまくいけば)多くのスペースを節約するはずです。

私がやろうとしていることを理解するのに役立つ短い例を書きました。

ofstream binFile;
binFile.open ("binary.bin", ios::out | ios::binary);

mpz_class test;
test.set_str("999999999999999",10);

binFile.write((char *)(&test), sizeof(test));

cout << "NUMBER: " << test << "\tSIZE: " << sizeof(test) << endl;
binFile.close();

mpz_classインスタンスを表す文字データを書き込もうとしています。次に、それをテストするために、ファイルを読み取ろうとしました。

ifstream binFile2;
binFile2.open("binary.bin", ios::in | ios::binary);

mpz_class num1 = 0; 
binFile2.read ((char *)(&num1), sizeof(num1));

cout << "NUMBER: " << num1 << "\tSIZE: " << sizeof(num1) << endl;
binFile2.close();

オンラインで見た多くの例では、クラスデータをバイナリファイルに保存するためにこのメソッドを使用していますが、私の出力は次のとおりです。

NUMBER: 999999999999999 SIZE: 12

NUMBER: 8589934595      SIZE: 12

クラスデータを直接保存してから再度読み取ることができないのはなぜですか?mpz_classのインスタンスのサイズを12にする方法はありません。これは、ポインターのサイズですか?

私もこれを試しましたが、基本的に同じことだと思います。

char* membuffer = new char[12]; //sizeof(test) returned 12
binFile2.read (membuffer , sizeof(test));
memcpy(&test, &membuffer, sizeof(test))

これを修正する方法についてのアドバイスをいただければ幸いです。ありがとう。

4

1 に答える 1

1

GMPマニュアル(セクション12.1)にもっと時間を費やす必要があると思います。

クラスから標準のC++タイプへの変換は自動的に行われず、代わりにget_siなどのメンバー関数が提供されます(詳細については、次のセクションを参照してください)。

だから、おそらくあなたがする必要があるのは、とを呼び出すことmpz_class::get_strですmpz_class::set_str。とにかく、C++インターフェースはCAPIの単なるラッパーであるため、文書化されている方がはるかに優れているため、低レベルのものを使用する方がおそらく良いでしょう。この場合、mpz_get_strand mpz_set_str(整数の場合)を使用する必要があります。

GMPデータ型の直接バイナリシリアル化を提供できるAPI関数がないため、文字列を操作する必要があることに注意してください。これらの獣のサイズに特定の制限があるかどうかはわかりません。そのため、このような多数を使用する場合は、コードを徹底的にテストする必要があります。おそらく最良の選択は、62進数(最大許容)で文字列表現を抽出して、メモリを爆破しないようにし(2進数では、ビットごとに1バイトを消費します)、それをファイルに書き込むことです。

于 2012-09-11T13:58:28.733 に答える