【发布时间】: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().againststd::cin没有任何问题。