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

23

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

注:原文中的 ouput 应为 output。

请明确你想要做什么。 - Brian Neal
我想打印出整个字符串。 - kal
5个回答

28

你可以输出istream的streambuf。

例如,将ifstream输出到cout:

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

12

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


显而易见的解决方案是使用while循环逐个复制单词,但你可以更简单地用一行代码实现:

#include <iostream>
#include <iterator>

...

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

流迭代器在内部使用运算符 << 和 >>,这意味着它们会忽略空格。如果您想获得精确的副本,则可以使用std::istreambuf_iterator和std::ostreambuf_iterator。它们作用于底层(未经格式化的)流缓冲区,因此不会跳过空格或转换换行符等内容。

您还可以使用:

 i >> std::noskipws;

为了防止空格消失。请注意,如果您的流是二进制文件,则可能会受到>><<运算符的其他字符损坏。


7
这将会逐个字符打印整个流:
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;

1
你需要从中读取,然后输出你读到的内容:
istream stm;
string str;
stm >> str;
cout << str;

只读取一个单词(以空格分隔)。我认为他想从流中复制所有内容。 - jalf
我认为如果他想要那个,他会说的。 - 1800 INFORMATION
3
谁知道他想要什么,这个问题很差劲。 - Brian Neal

0

std::ifstream 重载和 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.

basic_ostringstream是一个依赖于模板的函数。第一个函数应该被转换为"template<typename T> std::ostream& operator<<(std::ostream& os, std::basic_ostringstream<T>&& iss){ return os<<iss.str(); }"。 - Liu Hao Cheng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接