简体   繁体   中英

Copying streams in C++

The following program prints 0.

#include <ostream>
#include <string>
#include <sstream>
#include <iostream>

int main()
{
  std::string subjectString("subject");
  std::ostream tempStream(NULL);
  tempStream << subjectString;
  std::ostream& updatedStream = tempStream;
  std::stringstream ss;
  ss << updatedStream;
  std::cout << ss.str() << std::endl;
  return 0;
}

Why?

EDIT

As per Niall's sugesstion, I tried:

#include <ostream>
#include <string>
#include <sstream>
#include <iostream>

int main()
{
  std::string subjectString("subject");
  std::stringbuf buffer;
  std::ostream tempStream(&buffer);

  buffer.sputn(subjectString.c_str(), subjectString.size());

  std::stringstream ss;
  ss << tempStream;
  std::cout << ss.str() << std::endl;
  return 0;
}

Even this prints an address. Not the actual string.

The construction of std::ostream requires a buffer (not NULL).

In addition, basic_stream objects are not copyable;

basic_ostream( const basic_ostream& rhs ) = delete;

Reference;

http://en.cppreference.com/w/cpp/io/basic_ostream/basic_ostream

Try something more like this;

// ...
std::stringbuf buffer;
std::ostream tempStream(&buffer);
// ...

To associate a buffer with the stream.

Following on some of the discussions and edits;

In general, I would not directly manipulate the buffer, you should rather use the stream instead tempStream.write(...) . The exact details are beyond the immediate question/problem; being the initialisation of the first stream with the buffer and streaming content into that stream. If all you want to do with the code is check if the data is in the buffer, then you could use tempStream.rdbuf()->sgetn(...) .

You have already mentioned that this is part of a larger problem.

In the context of some the comments here and the original problem ; this could be a case in which direct manipulation of the buffer is needed (in much the same way as the stream would). Your implementation would need to be well tested since this is not "the usual" way of working with streams, but it can work; .rdbuf() is the manner in which you can get to the underlying buffer. I don't have an exact snippet (maybe that's another question), but you can "clear the buffer" by resetting the position(s) of the put and get areas to be the same (see the positioning, put and get area functions of the buffer - std::ostream::seekp was mentioned as being used to deal with this). I think you standard library implementation of stringstream could also offer some useful hints.

Because tempStream has no stream to hold anything.

ss.str() returns NULL (0).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM