2013-11-15 2 views
0

Я пробовал кучу методов, перечисленных здесь, но никто из них не работает. Он всегда ждет больше ввода.Как прекратить чтение из cin?

Я попытался 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

Как вы прекращаете ввод? С помощью bash вы можете использовать ctrl + d или просто подключить файл к вашему процессу. –

+0

Да, я использую ctrl d, когда делаю это вручную, или я перенаправляю файл. ни работает – ordinary

+0

Я думаю, что вы можете установить определенную строку, такую ​​как «quit» в качестве окончания ввода. – yanchong

ответ

0

Во-первых, сделать не использовать std::cin.eof() контролировать свой цикл! Это не работает. Кроме того, вам всегда нужно проверить успешный ввод после ввода.

Это означает, что для завершения ввода вам необходимо ввести соответствующий конец символа файла, возможно, в начале строки (как это работает полностью, зависит от системы, некоторых настроек и т. Д.). В Windows вы должны использовать Ctrl-Z, в UNIX вы будете использовать Ctrl-D.

-1

Во-первых, эта часть вашей программы пытается выделить 4 ГБ оперативной памяти в стеке, который не работает на моей машине (удачи найти любую машину с 4 Гб непрерывного пространства памяти):

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, так что вы используете только пространство, вы на самом деле нужно.

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; 
} 

Живая демонстрация: http://ideone.com/QR9fpM

Смежные вопросы