Запись содержимого stringstream в ofstream
-
11-07-2019 - |
Вопрос
В настоящее время я использую 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
.
Есть предложения о том, что я делаю не так?
Решение
Вы можете сделать это, для этого не нужно создавать строку. Это заставляет выходной поток считывать содержимое потока с правой стороны (можно использовать с любыми потоками).
outFile << ss.rdbuf();
Другие советы
Если вы используете std :: ostringstream
и задаетесь вопросом, почему ничего не пишется с помощью ss.rdbuf ()
, тогда используйте .str ()
функция. р>
outFile << oStream.str();
При передаче строкового потока rdbuf в поток новые строки не переводятся. Введенный текст может содержать \ n
, поэтому функция find replace работать не будет. Старый код записывает в fstream и переключает его на поток строк, что приводит к потере endl-перевода. Р>
Я бы лучше написал ss.str ();
вместо ss.rdbuf ();
(и использовал бы поток строк).
Если вы используете ss.rdbuf ()
, флаги форматирования outFile
будут сброшены, и ваш код не будет использоваться повторно.
То есть вызывающая сторона GetHolesResults (..., std :: ofstream & amp; outFile)
может захотеть написать что-то подобное, чтобы отобразить результат в таблице:
outFile << std::setw(12) << GetHolesResults ...
... и удивляешься, почему ширина игнорируется.