Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top