如何将istream变量打印到标准输出。 [编辑]我正在尝试调试我需要将istream输出到日志文件的场景
答案 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 :: 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.