我已经尝试过这里列出的一系列方法,但没有一种方法可行。它总是在等待更多的输入。
我尝试了while(std::getline(std::cin, line))
和下面的方法,似乎没有任何效果:
#include <iostream>
#include <sstream>
using namespace std;
int main(){
long length = 1UL<<32;
int array[length];
// memset(array, 0, (length-1) * sizeof(int));
for(int i = 0; i < length; i++)
array[i] = 0;
string line;
int num;
while(!cin.eof()){
getline(cin,line);
stringstream ss(line);
ss >>num;
array[num]++;
}
for(int i = 0; i < length; i++)
if(array[i]){
cout << i << ": ";
cout << array[i] << endl;
}
}
答案 0 :(得分:2)
首先,不使用std::cin.eof()
来控制你的循环!它不起作用。此外,您始终需要在输入之后检查输入是否成功。
也就是说,要终止输入,您需要输入相应的文件末尾字符,可能在行的开头(它的工作原理完全取决于系统,某些设置等)。在Windows上,您使用Ctrl-Z,在UNIX上使用Ctrl-D。
答案 1 :(得分:0)
首先,程序的这一部分尝试在堆栈上分配4 GB的内存,这在我的机器上不起作用(祝你好运找到任何具有4 GB连续内存空间的机器):
long length = 1UL<<32;
int array[length];
如果我将其改为更合理:
long length = 32;
然后它适用于我:
$ g++ -g test.cpp -o test && ./test
2
5
# pressed control+d
2: 1
5: 2
$
所以我猜其他错误。
注意:除非您实际计划使用所有这些索引,否则您可能需要考虑使用unordered_map
,因此您只能使用实际需要的空间。
答案 2 :(得分:0)
通过将“std :: cin”评估为bool,即while (cin)
,可以最轻松地测试您正在寻找的条件。但是在你试图超越EOF之前它不会这样做,所以期待一个空的getline:
#include <iostream>
#include <string>
int main() {
std::string input;
while (std::cin) {
std::cout << "Type something in:\n";
std::getline(std::cin, input);
if(input.empty())
continue;
std::cout << "You typed [" << input << "]\n";
}
std::cout << "Our work here is done.\n";
return 0;
}