std :: getline卡在管道输入结束时

时间:2015-12-01 21:16:48

标签: c++ stdio

我无法解析此文件:

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

特别是,在读取文件的最后一行后,进程陷入while循环。我正在通过&#34;标准输入&#34;来调用我的程序。 Eclipse中的功能。

为什么std::getline失败并导致程序完成?

问题要求:

  

澳大利亚选票要求选民对所有候选人进行排名   选择顺序。最初只计算第一个选项,如果   一名候选人获得该候选人超过50%的选票   当选。但是,如果没有候选人获得超过50%,则全部   被列为最低票数的候选人被淘汰。选票   首先对这些候选人进行排名是为了支持他们   排名最高的未被淘汰的候选人。这个消除过程   最弱的候选人,并计算他们的选票,支持   优先未被淘汰的候选人继续直到一名候选人   获得超过50%的选票,或直到所有剩余的候选人   并列。

     

输入

     

输入以一行上的单个正整数开头   表示随后的案件数量,每个案件如下所述。   该行后面是一个空行。还有一个空白行   在两个连续的输入之间。

     

每个案例的第一行是一个整数n $ \ le $ 20表示   候选人人数。接下来的n行由名称组成   候选人按顺序排列,每个长度最多可包含80个字符   任何可打印的字符。随后最多包含1,000行,每行包含   选票的内容。每张选票包含1到n的数字   按某种顺序。第一个数字表示第一个候选人   选择;第二个数字表示第二选择的候选人,等等   上。

     

输出

     

每个测试用例的输出由一行组成   包含获胜者的名字或包含的几行   所有被捆绑的候选人的姓名。每两个的输出   连续案例用空行分隔。

1 个答案:

答案 0 :(得分:0)

该程序实际上是正确的,但我以错误的方式通过Eclipse提供输入文件(它被视为交互式输入):

enter image description here

使用程序参数< input可以按预期工作:

enter image description here