Gui*_*lle 75 c++ iostream input
我正在编写一个程序,直接从用户输入读取数据,并想知道我怎么能(没有循环)读取所有数据,直到标准输入EOF.我正在考虑使用,cin.get( input, '\0' )
但'\0'
不是真正的EOF角色,只读到EOF或者'\0'
以先到者为准.
或者使用循环是唯一的方法吗?如果是这样,最好的方法是什么?
小智 66
从stdin读取可变数据量的唯一方法是使用循环.我总是发现这个std::getline()
功能非常好用:
std::string line;
while (std::getline(std::cin, line))
{
std::cout << line << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,getline()会读取直到换行符.您可以指定另一个终止字符,但EOF本身不是一个字符,因此您不能简单地调用getline().
Kei*_*thB 47
您可以使用流迭代器在没有显式循环的情况下执行此操作.我确信它在内部使用某种循环.
#include <string>
#include <iostream>
#include <istream>
#include <ostream>
#include <iterator>
int main()
{
// don't skip the whitespace while reading
std::cin >> std::noskipws;
// use stream iterators to copy the stream to a string
std::istream_iterator<char> it(std::cin);
std::istream_iterator<char> end;
std::string results(it, end);
std::cout << results;
}
Run Code Online (Sandbox Code Playgroud)
Deg*_*vik 43
使用循环:
#include <iostream>
using namespace std;
...
// numbers
int n;
while (cin >> n)
{
...
}
// lines
string line;
while (getline(cin, line))
{
...
}
// characters
char c;
while (cin.get(c))
{
...
}
Run Code Online (Sandbox Code Playgroud)
Ric*_*ith 22
在研究了KeithB的解决方案后std::istream_iterator
,我发现了std:istreambuf_iterator
.
测试程序将所有管道输入读入字符串,然后再将其写出:
#include <iostream>
#include <iterator>
#include <string>
int main()
{
std::istreambuf_iterator<char> begin(std::cin), end;
std::string s(begin, end);
std::cout << s;
}
Run Code Online (Sandbox Code Playgroud)
可能最简单,效率最高:
#include <iostream>
int main()
{
std::cout << std::cin.rdbuf();
}
Run Code Online (Sandbox Code Playgroud)
如果需要,请std::ostringstream
在此处使用其他类型的流,如缓冲区而不是标准输出流.
归档时间: |
|
查看次数: |
190565 次 |
最近记录: |