Cin循环从不终止

我无法让我的cin循环终止在我的程序中。 我的程序使用Linuxredirect从文件hw07data中读入input,数据文件如下所示:

100 20 50 100 40 -1 A34F 90 15 50 99 32 -1 N12O 80 15 34 90 22 -1 

第一部分是class级总分,下一行是学生身份证号码,后面是他们的分数,全部以-1结尾。

我的问题:我的while循环不会终止,当我运行命令./a.out <hw07data ,任何人都可以看看我的代码,并给我一些提示? 我不想要答案,因为这是作业,我只需要一些指导。 谢谢!!

 #include <iostream> #include <iomanip> using namespace std; const int SENTINEL = -1; //signal to end part of file const int LTAB = 8; //left tab const int RTAB = 13; //right tab int main() { cout << "Grant Mercer Assignment 7 Section 1002\n\n"; cout << setprecision(2) << fixed << showpoint; cout << left << setw(LTAB) << "ID CODE" << right << setw(RTAB) << "POINTS" << setw(RTAB) << "PCT" << setw(RTAB) << "GRADE" << endl; double Percentage, //holds students percentage AvgPercentage; int Earnedpoints, //earned points for specific student Totalpoints, //total points possible for all students AvgPoints, //average points for all students NumClass; //counts the number of students Totalpoints = Earnedpoints = //set all vals equal to zero AvgPoints = AvgPercentage = Percentage = NumClass = 0; //first and last char for studentID char Fchar,Lchar, Num1, Num2, Grade; int TmpVal = 0; //temporary value cin >> TmpVal; while(TmpVal != -1) //reading in TOTAL POINTS { Totalpoints += TmpVal; //add scores onto each other cin >> TmpVal; //read in next value } while(cin) //WHILE LOOP ISSUE HERE! { //read in student initials cin >> Fchar >> Num1 >> Num2 >> Lchar >> TmpVal; while(TmpVal != -1) { Earnedpoints += TmpVal; //read in points earned cin >> TmpVal; } //calculate percentage Percentage = ((double)Earnedpoints / Totalpoints) * 100; AvgPercentage += Percentage; NumClass++; if(Percentage >= 90) //determine grade for student Grade = 'A'; else if(Percentage >= 80 && Percentage < 90) Grade = 'B'; else if(Percentage >= 70 && Percentage < 80) Grade = 'C'; else if(Percentage >= 60 && Percentage < 70) Grade = 'D'; else if(Percentage < 60) Grade = 'F'; //display information on student cout << left << Fchar << Num1 << Num2 << setw(LTAB) << Lchar << right << setw(RTAB-3) << Earnedpoints << setw(RTAB) << Percentage << setw(RTAB) << Grade << endl; TmpVal = Earnedpoints = 0; } AvgPercentage /= NumClass; cout << endl << left << setw(LTAB+20) << "Class size: " << right << setw(RTAB) << NumClass << endl; cout << left << setw(LTAB+20) << "Total points possible: " << right << setw(RTAB) << Totalpoints << endl; cout << left << setw(LTAB+20) << "Average point total: " << right << setw(RTAB) << AvgPoints << endl; cout << left << setw(LTAB+20) << "Average percentage: " << right << setw(RTAB) << AvgPercentage << endl; } 

输出继续要求新的input。

你可能会在那里找到答案如何阅读,直到从cin的EOF C ++

所以你可以使用getline逐行读取cin ,并解析结果行,如下所示:

 #include <iostream> #include <sstream> #include <string> int main() { int a, b; std::string line; while (std::getline(std::cin, line)) { std::stringstream stream(line); stream >> a >> b; std::cout << "a: " << a << " - b: " << b << std::endl; } return 0; } 

编辑:不要忘记检查解析结果和流状态的任何失败!

你应该经常检查你输入的是否成功:

 if (std::cin >> TmpVal) { // do simething with the read value } else { // deal with failed input } 

如果发生故障,晚上要检查eof() ,告知故障是由于到达输入的末尾。

要处理错误,请查看std::istream::clear()std::istream::ignore()