Подтвердить что ты не робот

Запись содержимого струнного потока в поток

В настоящее время я использую 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.

Любое предложение о том, что я делаю неправильно?

4b9b3361

Ответ 1

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

outFile << ss.rdbuf();

Ответ 2

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

outFile << oStream.str();

Ответ 3

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

Ответ 4

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

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

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

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