Запись содержимого stringstream в ofstream - PullRequest
44 голосов
/ 28 ноября 2008

Я сейчас использую 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.

Есть предложения о том, что я делаю не так?

Ответы [ 4 ]

77 голосов
/ 28 ноября 2008

Вы можете сделать это, для этого не нужно создавать строку. Это заставляет выходной поток считывать содержимое потока с правой стороны (можно использовать с любыми потоками).

outFile << ss.rdbuf();
12 голосов
/ 16 марта 2015

Если вы используете std::ostringstream и задаетесь вопросом, почему ничего не пишется с ss.rdbuf(), тогда используйте .str() функцию.

outFile << oStream.str();
3 голосов
/ 07 декабря 2012

При передаче строкового потока rdbuf в поток новые строки не переводятся. Введенный текст может содержать \n, поэтому команда find replace не будет работать. Старый код записывает в fstream и переключает его на поток строк, что приводит к потере endl-перевода.

0 голосов
/ 14 декабря 2018

Я бы лучше написал ss.str(); вместо ss.rdbuf(); (и использовал бы поток строк).

Если вы используете ss.rdbuf(), флажки форматирования outFile будут сброшены, и ваш код не будет использоваться повторно. То есть, вызывающий GetHolesResults(..., std::ofstream &outFile) может захотеть написать что-то вроде этого, чтобы отобразить результат в таблице:

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

... и удивляюсь, почему ширина игнорируется.

...