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 的数字 以某种顺序。第一个数字表示第一的候选人 选择;第二个数字表示第二选择的候选人,所以 开。
输出
每个测试用例的输出由单行组成 包含获胜者的姓名或包含 并列的所有候选人的姓名。每两个的输出 连续的案例用空行分隔。
【问题讨论】:
使用getline
和cin
将永远等待来自标准输入的更多输入,无论您已经提供了多少输入,它都会等待更多。
代码按预期终止。
请不要将std::cin
和std::getline
混为一谈——这太乱了。
@AndreaCasaccia:如果文件无效,则循环终止。最可能的区别是您以某种方式为您安排cat
不终止,例如使用cat input - | program
。改用program < input
...
需要明确的是,调用std::getline()
或istream::getline()
.against std::cin
没有任何问题。
【参考方案1】:
该程序实际上是正确的,但是我以错误的方式通过 Eclipse 提供输入文件(它被视为交互式输入):
使用程序参数< input
可以按预期工作:
【讨论】:
以上是关于std::getline 卡在管道输入的末尾的主要内容,如果未能解决你的问题,请参考以下文章
为啥 std::getline() 在格式化提取后跳过输入?
为啥 std::getline() 在格式化提取后跳过输入?
为啥 std::getline() 在格式化提取后跳过输入?
为啥 std::getline() 在格式化提取后跳过输入?