【发布时间】:2010-10-15 03:02:48
【问题描述】:
如何将 istream 变量打印到标准输出。 [编辑] 我正在尝试调试一个需要将 istream 输出到日志文件的场景
【问题讨论】:
-
请说明您要做什么。
-
我想打印出整个字符串
如何将 istream 变量打印到标准输出。 [编辑] 我正在尝试调试一个需要将 istream 输出到日志文件的场景
【问题讨论】:
您输出 istream 的 streambuf。
例如,输出一个 ifstream 到 cout:
std::ifstream f("whatever");
std::cout << f.rdbuf();
【讨论】:
编辑: 我假设您要复制流的全部内容,而不仅仅是一个值。如果您只想阅读一个单词,请改为查看 1800 的答案。
显而易见的解决方案是一次复制一个单词的 while 循环,但您可以更简单地使用它,作为一个不错的 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_iterator 在内部使用运算符 >,这意味着它们将忽略空格。如果你想要一个精确的副本,你可以使用 std::istreambuf_iterator 和 std::ostreambuf_iterator 代替。它们在底层(未格式化)流缓冲区上工作,因此它们不会跳过空格或转换换行符或任何东西。
你也可以使用:
i >> std::noskipws;
防止空白消失。但是请注意,如果您的流是二进制文件,则>> 和<< 运算符可能会破坏其他一些字符。
【讨论】:
这将打印整个流,一次 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;
【讨论】:
你需要从中读取,然后输出你读取的内容:
istream stm;
string str;
stm >> str;
cout << str;
【讨论】:
注意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.
【讨论】: