重定向的cout - > std :: stringstream,没有看到EOL

时间:2009-12-10 15:07:20

标签: c++ redirect stringstream cout

我已经阅读了一些关于将std :: cout重定向到stringstreams的帖子,但是我在阅读重定向字符串时遇到了问题。

std::stringstream redirectStream;
std::cout.rdbuf( redirectStream.rdbuf() );

std::cout << "Hello1\n";
std::cout << "Hello2\n";

while(std::getline(redirectStream, str))
{
  // This does not work - as the contents of redirectStream 
  // do not include the '\n' - I only see "Hello1Hello2"
}

我需要在初始输出中选出新行 - 有人可以告诉我如何做到这一点吗?

感谢。

2 个答案:

答案 0 :(得分:3)

适合我的工作:
注意:std :: getline()读取行(但不是'\ n'字符,读取每行后抛出行终止符)。但是每一行都会输入一次循环。

#include <iostream>
#include <sstream>

int main()
{
    std::stringstream   redirectStream;
    std::streambuf*     oldbuf  = std::cout.rdbuf( redirectStream.rdbuf() );

    std::cout << "Hello1\n";
    std::cout << "Hello2\n";

    std::string str;
    while(std::getline(redirectStream, str))
    {
        fprintf(stdout,"Line: %s\n",str.c_str());
        // loop enter once for each line.
        // Note: str does not include the '\n' character.
    }

    // In real life use RAII to do this. Simplified here for code clarity.
    std::cout.rdbuf(oldbuf);
}

注意:您需要将旧的流缓冲区放回到std :: cout中。一旦stringstream'redirectStream'超出范围,其缓冲区将被销毁,使std :: cout指向无效的流缓冲区。由于std :: cout的寿命比'redirectStream'长,因此需要确保std :: cout不会访问无效对象。因此,最简单的解决方案是放回旧缓冲区。

答案 1 :(得分:0)

感谢您的回复。我可以看到我做错了什么。因为我删除了很多代码来简化我的问题,是的,我确实发布了一个工作版本!看来我的实际逻辑是问题:

// Basically... 
std::string str; 
std::stringstream redirectstream; 
// perform the redirection... 
// ... 

while (!done)
{ 
  while(std::getline(redirectStream, str)) 
  { 
    // stuff... 
  } 
  std::cout << "Hello1\n"; 
  std::cout << "Hello2\n"; 
} 

在这种情况下,似乎getline()函数似乎不再有效。你能解释一下吗?

我现在意识到这是一个完全不同的问题而且我因为错误的初始帖子而误导道歉。