std::getline 卡在管道输入的末尾

Posted

技术标签:

【中文标题】std::getline 卡在管道输入的末尾【英文标题】:std::getline stuck on end of piped input 【发布时间】:2015-12-01 21:16:47 【问题描述】:

我无法解析此文件:

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 循环中。我正在通过 Eclipse 中的“标准输入”功能调用我的程序。

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


问题要求:

澳大利亚的投票要求选民对所有候选人进行排名 选择的顺序。最初只计算第一个选择,如果 一名候选人获得超过 50% 的选票,然后该候选人 is elected.但是,如果没有候选人获得超过 50%,所有 得票最少的候选人被淘汰。选票 将这些候选人排在第一位,以支持他们的 排名最高的非淘汰候选人。这个消除过程 最弱的候选人并计算他们的选票以支持 首选的非淘汰候选人持续到一名候选人 获得超过 50% 的选票,或直到所有剩余的候选人 被捆绑了。

输入

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

每个案例的第一行是一个整数 n$ \le$20 表示 候选人人数。接下来的 n 行包含 候选人按顺序排列,每个最多 80 个字符,包含 任何可打印的字符。接下来最多 1,000 行,每行包含 选票的内容。每张选票包含从 1 到 n 的数字 以某种顺序。第一个数字表示第一的候选人 选择;第二个数字表示第二选择的候选人,所以 开。

输出

每个测试用例的输出由单行组成 包含获胜者的姓名或包含 并列的所有候选人的姓名。每两个的输出 连续的案例用空行分隔。

【问题讨论】:

使用getlinecin 将永远等待来自标准输入的更多输入,无论您已经提供了多少输入,它都会等待更多。 代码按预期终止。 请不要将std::cinstd::getline 混为一谈——这太乱了。 @AndreaCasaccia:如果文件无效,则循环终止。最可能的区别是您以某种方式为您安排cat 不终止,例如使用cat input - | program。改用program &lt; input... 需要明确的是,调用std::getline()istream::getline().against std::cin 没有任何问题。 【参考方案1】:

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

使用程序参数&lt; input 可以按预期工作:

【讨论】:

以上是关于std::getline 卡在管道输入的末尾的主要内容,如果未能解决你的问题,请参考以下文章

为啥 std::getline() 在格式化提取后跳过输入?

为啥 std::getline() 在格式化提取后跳过输入?

为啥 std::getline() 在格式化提取后跳过输入?

为啥 std::getline() 在格式化提取后跳过输入?

为啥 std::getline() 在格式化提取后跳过输入?

使用带有标准输入和标准输出重定向的 2 进程管道时如何避免标准输入上的重复输入