簡體   English   中英

在C ++中復制流

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM