2015-12-01 2 views
0

Я неисправный разобрать этот файл:станд :: GetLine застрял на конце централизованного ввода

1 

3 
John Doe 
Jane Smith 
Jane Austen 
1 2 3 
2 1 3 
2 3 1 
1 2 3 
3 1 2 

со следующей программой:

#include <iostream> 
#include <sstream> 

int main(int argc, char * argv[]) 
{ 

    int cases, candidates_number; 
    char candidates[20][80]; 
    int votes[20][1000]; 
    int votes_count[20]; 

    std::string line; 

    std::cin >> cases; 
    std::cin.get(); 
    std::cin.get(); 

    for (int i=0; i<cases; i++) { 

     std::cin >> candidates_number; 
     std::cin.get(); 

     for (int j=0; j<candidates_number; j++) { 
      std::cin.getline(candidates[j], sizeof(candidates[j]), '\n'); 
     } 

     int votes_number = 0; 

     while (std::getline(std::cin, line)) { 
      if (line.empty()) { 
       break; 
      } 
      std::cout << line; 
      votes_number++; 
     } 

    } 
    return 0; 
} 

В частности, процесс застревает в то время цикл после прочтения последней строки файла. Я вызываю свою программу через функцию «Стандартный ввод» в Eclipse.

Почему не std::getline не удается завершить программу?


требования Проблема:

Австралийские бюллетени требуют, чтобы избиратели ранжировать всех кандидатов в порядке выбора. Первоначально учитываются только первые выборы, и если один кандидат получает более 50% голосов, тогда выбирается кандидат . Однако, если ни один из кандидатов не получает более 50%, все кандидатов, увязанных за наименьшее количество голосов, исключаются. Бюллетени ранжирование этих кандидатов сначала пересчитывается в пользу их наивысшего ранга не исключенного кандидата. Этот процесс устранения самых слабых кандидатов и подсчета их избирательных бюллетеней в пользу предпочтительного неисполненного кандидата продолжается до тех пор, пока один кандидат не получит более 50% голосов или пока не будут привязаны все оставшиеся кандидаты .

Входной

вход начинается с одного положительного целого числа на отдельной строке с указанием количества случаев следующие, каждый, как описано ниже. За этой строкой следует пустая строка. Также существует пустая строка между двумя последовательными входами.

Первая строка каждого случая представляет собой целое число n $ \ le $ 20, указывающее число кандидатов . Следующие n строк состоят из имен кандидатов по порядку, каждая длиной до 80 символов и содержит любых печатных символов. До 1000 строк, каждая из которых содержит содержание бюллетеня. Каждый бюллетень содержит цифры от 1 до n в некотором порядке. Первое число указывает кандидата первого ; второе число указывает кандидата второго выбора, и поэтому on.

Выход

Выход каждого тест состоит либо из одной строки , содержащего имя победителя или нескольких строк, содержащих имен всех кандидатов, которые связаны. Выход каждого из двух последовательных случаев разделяется пустой строкой.

+1

с помощью '' getline' с cin' не будет ждать вечно для более вход со стандартного входа, независимо от того, как большой вклад, который вы уже дали, он будет ждать больше. – David

+1

Код завершается, как и ожидалось для меня. –

+0

Пожалуйста, не смешивайте 'std :: cin' и' std :: getline' - это беспорядок. – erip

ответ

0

Программа была на самом деле правильно, но я кормил входного файла через Eclipse, в неправильном направлении (это рассматривалось как интерактивный вход):

enter image description here

Использование программы аргумент < input вместо работы как и ожидалось:

enter image description here

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