如何将整个istream打印到标准输出和字符串

时间:2009-03-24 02:22:39

标签: c++ stream

如何将istream变量打印到标准输出。 [编辑]我正在尝试调试我需要将istream输出到日志文件的场景

5 个答案:

答案 0 :(得分:21)

输出istream streambuf。

例如,要将ifstream输出到cout:

std::ifstream f("whatever");
std::cout << f.rdbuf();

答案 1 :(得分:11)

编辑:我假设您要复制流的全部内容,而不仅仅是单个值。如果您只想阅读一个单词,请检查1800的答案。


显而易见的解决方案是一次循环复制一个单词,但你可以做得更简单,作为一个很好的oneliner:

#include <iostream>
#include <iterator>

...

std::istream i;
std::copy(std::istream_iterator<char>(i), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout));

stream_iterators使用运算符&lt;&lt;和&gt;&gt;在内部,意味着他们会忽略空白。如果你想要一个精确的副本,你可以使用std :: istreambuf_iterator和std :: ostreambuf_iterator。它们处理底层(未格式化)的流缓冲区,因此它们不会跳过空格或转换换行符或任何内容。

您也可以使用:

 i >> std::noskipws;

防止空格消失。但请注意,如果您的流是二进制文件,则>><<运算符可能会破坏其他一些字符。

答案 2 :(得分:5)

这将打印整个流,一次1个字符:

char c;
c = my_istream.get();
while (my_istream)
{
    std::cout << c;
    c = my_istream.get();
}

这将打印整个内容,但丢弃空白:

std::string output;
while(my_istream >> output)
    std::cout << output;

答案 3 :(得分:0)

你需要阅读它,然后输出你读到的内容:

istream stm;
string str;
stm >> str;
cout << str;

答案 4 :(得分:0)

std :: ifsream重载和std :: ostringstream

c ++ 11或更高

请注意 std :: ifstream 中允许您直接使用的&&

#include <iostream>
#include <sstream>
#include <fstream>

std::ostream& operator<<(std::ostream& os, std::basic_ostringstream&& iss){
    return os<<iss.str();
}

std::ostream& operator<<(std::ostream& os, std::ifstream&& ifs){
    return std::cout<<ifs.rdbuf();
}


int main()
{
    std::cout<<std::ostringstream("Test ostringstream overloading")<<std::endl;
    std::ofstream("fstream.txt")<<"Test fstream overloading"<<std::endl;
    std::cout<<std::ifstream("fstream.txt")<<std::endl; // overloading okay
}

输出:

Test ostringstream overloading
Test fstream overloading


Process returned 0 (0x0)   execution time : 0.012 s
Press ENTER to continue.