web-dev-qa-db-ja.com

ofstreamへのstringstreamコンテンツの書き込み

現在、次のようにstd::ofstreamを使用しています。

std::ofstream outFile;
outFile.open(output_file);

次に、次のようにstd::stringstreamオブジェクトをoutFileに渡そうとします。

GetHolesResults(..., std::ofstream &outFile){
  float x = 1234;
  std::stringstream ss;
  ss << x << std::endl;
  outFile << ss;
}

これで、私のoutFileにはゴミのみが含まれます: "0012E708"が繰り返されます。

GetHolesResultsに書くことができます

outFile << "Foo" << std:endl; 

outFileに正しく出力されます。

私が間違っていることに関する提案はありますか?

46
Eric

これを行うことができますが、文字列を作成する必要はありません。出力ストリームに右側のストリームのコンテンツを読み取らせます(任意のストリームで使用可能)。

outFile << ss.rdbuf();

_std::ostringstream_を使用していて、なぜss.rdbuf()で何も書き込まれないのか疑問に思っている場合は、.str()関数を使用します。

_outFile << oStream.str();
_
13
Digital_Reality

Stringstream rdbufをストリームに渡すと、改行は変換されません。入力テキストには\nを含めることができるため、検索置換は機能しません。古いコードはfstreamに書き込み、それをstringstreamに切り替えるとendl変換が失われます。

3
2ndshot

私はss.str();の代わりにss.rdbuf();を書きたい(そして文字列ストリームを使用する)。

ss.rdbuf()を使用すると、outFileのフォーマットフラグがリセットされ、コードが再利用できなくなります。つまり、GetHolesResults(..., std::ofstream &outFile)の呼び出し元は、結果をテーブルに表示するために次のようなものを書きたいかもしれません。

outFile << std::setw(12) << GetHolesResults ...

...そして、なぜ幅が無視されるのか疑問に思います。

1
chipsbarrier