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;
}
默认情况下,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;
}
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))
{
   ...
}
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;
}
可能最简单,效率最高:
#include <iostream>
int main()
{
    std::cout << std::cin.rdbuf();
}
如果需要,请std::ostringstream在此处使用其他类型的流,如缓冲区而不是标准输出流.
| 归档时间: | 
 | 
| 查看次数: | 190565 次 | 
| 最近记录: |