66

I'm currently using std::ofstream as follows:

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

Then I attempt to pass a std::stringstream object to outFile as follows:

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

Now my outFile contains nothing but garbage: "0012E708" repeated all over.

In GetHolesResults I can write

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

and it will output correctly in outFile.

Any suggestion on what I'm doing wrong?

abcd
  • 10,215
  • 15
  • 51
  • 85
Eric
  • 19,525
  • 19
  • 84
  • 147

4 Answers4

117

You can do this, which doesn't need to create the string. It makes the output stream read out the contents of the stream on the right side (usable with any streams).

outFile << ss.rdbuf();
Aykhan Hagverdili
  • 28,141
  • 6
  • 41
  • 93
Johannes Schaub - litb
  • 496,577
  • 130
  • 894
  • 1,212
  • 15
    I'm curious: why this solution works with `std::stringstream` but not with `std::ostringstream`? In the second case I am getting an empty file. – Javi Feb 02 '15 at 11:29
  • 12
    @JaviV because you can [only write](http://en.cppreference.com/w/cpp/io/basic_ostream) to `std::oANYSTREAM` and only read from `std::iANYSTREAM`. There will be no sense for `output_stream` if it would have also `read` operations. If you need both just use `std::ANYSTREAM` and you are home :) – S.R Oct 25 '17 at 08:11
  • I'm backing here after upvoting years ago. Its a bit weird that the compiler does not warning about call rdbuf from ostringstream – Vinicius Almada Oct 04 '22 at 04:42
25

If you are using std::ostringstream and wondering why nothing get written with ss.rdbuf() then use .str() function.

outFile << oStream.str();
Digital_Reality
  • 4,488
  • 1
  • 29
  • 31
  • 11
    your answer led me to the following realization: to get a `char` array from `ss`, you can do `ss.str().c_str()`. (just posting here for the benefit of newbies who stumble on this in the future.) – abcd Oct 16 '15 at 16:57
  • 2
    @Digital_Reality, thanks! nothing was getting written when i used rdbuff. What is the reason for this? – Nasir Oct 28 '15 at 06:49
4

When passing a stringstream rdbuf to a stream newlines are not translated. The input text can contain \n so find replace won't work. The old code wrote to an fstream and switching it to a stringstream losses the endl translation.

SchmitzIT
  • 9,227
  • 9
  • 65
  • 92
2ndshot
  • 49
  • 1
  • 6
    This should be a comment not an answer because you haven't told how to write a std::stringstream to a std::ofstream – Alex Bitek Jun 12 '13 at 06:13
2

I'd rather write ss.str(); instead of ss.rdbuf(); (and use a stringstream).

If you use ss.rdbuf() the format-flags of outFile will be reset rendering your code non-reusable. I.e., the caller of GetHolesResults(..., std::ofstream &outFile) might want to write something like this to display the result in a table:

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

...and wonder why the width is ignored.