3

std::ofstreamバイナリ モードで一連の符号なし整数を書き込む必要があります。

std::ofstream f;
f.open("some path", std::ios::out | std::ios::binary);
// some loop
{
  unsigned int k = get_k(); // may product numbers from 0 to 65535
  f << k;
}
f.close();

それらは区切り文字なしで「そのまま」出力ファイルに書き込まれます。そのため、 を使用してそれらを読み戻そうとすると (私が書いたものを取得することを期待して) std::ifstream、非常に奇妙な値が得られます。私が間違っていることは何ですか?

または' '、それらを区切るために追加された数字の後にストリームに (スペース) を入れる必要がありますか?

ありがとう。

4

2 に答える 2

5

operator<<()フォーマットされたテキストをストリームに出力するものを使用しています。したがって、平文をバイナリファイルに書き込むと、バイナリモードでの書き込みの目的が損なわれます。テキストエディタで出力ファイルを開いてみて、自分の目で確かめてください。

テキストモードで書き込み、値を空白で区切る(フォーマットされた出力を使用する場合、バイナリモードでの書き込みは誤解を招くため)か、write()キャストでストリームのメソッドを使用するかの2つの選択肢があります。

f.write(reinterpret_cast<char*>(&k), sizeof(int));
// ...
f.read(reinterpret_cast<char*>(&k), sizeof(int));

私は個人的にテキストモードで書くのが好きです。これは、よりクリーンなコードとポータブルな出力ファイルを持つことを意味します。必要な場合は、ファイルを圧縮できます。

于 2010-03-19T15:39:42.577 に答える
3

operator<<出力として書式設定されたテキストを生成するため、数字の間に何らかの空白を入れて数字を区切る必要があります。そうしないと、それらはすべて一緒になって 1 つの巨大な数字の文字列になり、読み返すと、オーバーフローするまで数値の一部として数字を読み続けます。たとえば、13 回書き込んだ場合は、として戻って111ください。

于 2010-03-19T15:04:27.483 に答える