[英]Copying streams in C++
下面的程序打印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;
}
為什么?
編輯
根據Niall的建議,我嘗試過:
#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;
}
即使這樣也會打印地址。 不是實際的字符串。
std::ostream
的構造需要一個緩沖區(非NULL)。
另外, basic_stream
對象是不可復制的。
basic_ostream( const basic_ostream& rhs ) = delete;
參考;
http://en.cppreference.com/w/cpp/io/basic_ostream/basic_ostream
嘗試更多類似的東西;
// ...
std::stringbuf buffer;
std::ostream tempStream(&buffer);
// ...
將緩沖區與流關聯。
進行一些討論和編輯;
通常,我不會直接操作緩沖區,而應該使用流而不是tempStream.write(...)
。 確切的細節超出了當前的問題。 是使用緩沖區將第一流初始化並將內容流式傳輸到該流中。 如果您只想檢查代碼是否在緩沖區中,則可以使用tempStream.rdbuf()->sgetn(...)
。
您已經提到這是一個較大問題的一部分。
在一些評論和原始問題的語境中; 在這種情況下,可能需要直接操作緩沖區(與流所使用的方式幾乎相同)。 您的實現需要經過良好的測試,因為這不是使用流的“通常”方式,但是它可以工作。 .rdbuf()
是訪問底層緩沖區的方式。 我沒有確切的代碼段(也許是另一個問題),但是您可以通過重置放置區域和獲取區域的位置相同來“清除緩沖區”(請參閱定位,放置區域和獲取區域的功能)緩沖區std::ostream::seekp
被提到用來處理此問題)。 我認為您的stringstream
標准庫實現也可以提供一些有用的提示。
因為tempStream
沒有流可容納任何內容。
ss.str()
返回NULL(0)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.