std::getline 卡在管道输入的末端
std::getline stuck on end of piped input
我无法解析此文件:
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 中的 "Standard input" 功能调用我的程序。
为什么 std::getline
没有失败并导致程序完成?
问题要求:
Australian ballots require that voters rank all the candidates in
order of choice. Initially only the first choices are counted, and if
one candidate receives more than 50% of the vote then that candidate
is elected. However, if no candidate receives more than 50%, all
candidates tied for the lowest number of votes are eliminated. Ballots
ranking these candidates first are recounted in favor of their
highest-ranked non-eliminated candidate. This process of eliminating
the weakest candidates and counting their ballots in favor of the
preferred non-eliminated candidate continues until one candidate
receives more than 50% of the vote, or until all remaining candidates
are tied.
Input
The input begins with a single positive integer on a line by itself
indicating the number of cases following, each as described below.
This line is followed by a blank line. There is also a blank line
between two consecutive inputs.
The first line of each case is an integer n$ \le indicating the
number of candidates. The next n lines consist of the names of the
candidates in order, each up to 80 characters in length and containing
any printable characters. Up to 1,000 lines follow, each containing
the contents of a ballot. Each ballot contains the numbers from 1 to n
in some order. The first number indicates the candidate of first
choice; the second number indicates candidate of second choice, and so
on.
Output
The output of each test case consists of either a single line
containing the name of the winner or several lines containing the
names of all candidates who are tied. The output of each two
consecutive cases are separated by a blank line.
该程序实际上是正确的,但我以错误的方式通过 Eclipse 提供输入文件(它被视为交互式输入):
使用程序参数 < input
而不是按预期工作:
我无法解析此文件:
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 中的 "Standard input" 功能调用我的程序。
为什么 std::getline
没有失败并导致程序完成?
问题要求:
Australian ballots require that voters rank all the candidates in order of choice. Initially only the first choices are counted, and if one candidate receives more than 50% of the vote then that candidate is elected. However, if no candidate receives more than 50%, all candidates tied for the lowest number of votes are eliminated. Ballots ranking these candidates first are recounted in favor of their highest-ranked non-eliminated candidate. This process of eliminating the weakest candidates and counting their ballots in favor of the preferred non-eliminated candidate continues until one candidate receives more than 50% of the vote, or until all remaining candidates are tied.
Input
The input begins with a single positive integer on a line by itself indicating the number of cases following, each as described below. This line is followed by a blank line. There is also a blank line between two consecutive inputs.
The first line of each case is an integer n$ \le indicating the number of candidates. The next n lines consist of the names of the candidates in order, each up to 80 characters in length and containing any printable characters. Up to 1,000 lines follow, each containing the contents of a ballot. Each ballot contains the numbers from 1 to n in some order. The first number indicates the candidate of first choice; the second number indicates candidate of second choice, and so on.
Output
The output of each test case consists of either a single line containing the name of the winner or several lines containing the names of all candidates who are tied. The output of each two consecutive cases are separated by a blank line.
该程序实际上是正确的,但我以错误的方式通过 Eclipse 提供输入文件(它被视为交互式输入):
使用程序参数 < input
而不是按预期工作: