gpt4 book ai didi

c++ - 在c++中读取文件时fstream无限循环

转载 作者:太空狗 更新时间:2023-10-29 20:45:47 24 4
gpt4 key购买 nike

我在我学校的 CS101 类里面使用 C++。我有一个程序必须读取这种格式的文件:

Ramirez, Manny
1572838992 a 4 b 5 x 4 a 7 c 3 c 4 *
Kemp, Matt
3337474858 a 4 b 4 b 4 a 4 *

读取文件,计算每个学生的GPA,输出学生姓名、ID、学分、GPA。一段时间以来,我一直在尝试不同的事情,而且我一直在无限循环中来回走动。我从一个 friend 那里得到了帮助,他让我加入了一些东西。

我曾多次尝试更改 while (!eof) 循环内的循环条件,我数不过来。每次我在网上查找要做什么时,我得到的建议就是不要使用 while !eof,因为它有导致无限循环的倾向。好吧,我现在知道了,但是我的教授希望我们那样做。

这是我的代码:

 #include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <sstream>
using namespace std;
int main() {

char grade;
int units=0, studentsGrade=0, studentUnits=0;
int unitTotal=0;
float gradeTotal=0, gpa = 0;
string inputName, outputName, fullName;
long ID;
ifstream inputFile;
ofstream outputFile;

cout << "Please enter the input filename: ";
cin >> inputName;
cout << "Please enter the output filename: ";
cin >> outputName;
inputFile.open(inputName.c_str());
if (inputFile.fail())
cout << "Bad input file name." << endl;
else {
outputFile.open(outputName.c_str());
outputFile << left << setw(25) << "Name" << setw(15) << "ID" << setw(15)
<< "Units" << setw(15) << "GPA" << endl;
outputFile << "--------------------------------------------------------------------------------" << endl;
cout << left << setw(25) << "Name" << setw(15) << "ID" << setw(15)
<< "Units" << setw(15) << "GPA" << endl;
cout << "--------------------------------------------------------------------------------" << endl;





getline(inputFile, fullName);
while (!inputFile.eof()) {
gpa = 0;
unitTotal = 0;
gradeTotal = 0;
inputFile >> ID;
outputFile << setw(25) << fullName;
outputFile << setw(15) << ID;
cout << setw(25) << fullName << setw(15) << ID;
string line;
getline(inputFile,line);
istringstream iss(line);
while (!iss.eof()) {
units = 0;
iss >> grade >> units;
if (grade == '*')
break;
if (units > 0 && units <=5 && (grade == 'a' || grade == 'A')) {
gradeTotal += 4 * units;
studentsGrade += 4 * units;
unitTotal += units;
studentUnits += units;}
else if (units > 0 && units <=5 && (grade == 'b' || grade == 'B')) {
gradeTotal += 3 * units;
studentsGrade += 3 * units;
unitTotal += units;
studentUnits += units; }
else if (units > 0 && units <=5 && (grade == 'c' || grade == 'C')) {
gradeTotal += 2 * units;
studentsGrade += 2 * units;
unitTotal += units;
studentUnits += units; }
else if (units > 0 && units <=5 && (grade == 'd' || grade == 'D')) {
gradeTotal += 1 * units;
studentsGrade += 1 * units;
unitTotal += units;
studentUnits += units; }
else if (units > 0 && units <=5 && (grade == 'f' || grade == 'F')) {
unitTotal += units;
studentUnits += units; }
else if (grade == '*') {
unitTotal += 0;}
else {
unitTotal += 0; }
}
gpa = (float)gradeTotal / unitTotal;
outputFile << fixed << showpoint;
outputFile << setw(15) << unitTotal << setw(15) << setprecision(2) << gpa << endl;
cout << fixed << showpoint;
cout << setw(15) << unitTotal << setw(15) << setprecision(2) << gpa << endl;
getline(inputFile,fullName);
}
outputFile << "The GPA for all students is " << setprecision(2) << (float)studentsGrade / studentUnits;
cout << "The GPA for all students is " << setprecision(2) << (float)studentsGrade / studentUnits << endl;

}
inputFile.close();
outputFile.close();
cout << endl;
return 0;
}

如果有人能向我解释为什么我总是遇到无限循环,我将不胜感激。

最佳答案

虽然它需要通过运行代码来验证,但您似乎设置了 failbitbadbit 而不是 eof .例如,这可能发生在您进行其他读取而不是 getline() 之后 - 例如 inputFile >> ID;

由于您只检查 eof,因此循环无休止地运行并且 I/O 错误将被忽略。我会说尝试使用 getline() 的结果并使用 std::istreamoperator void* 而不是检查 eof().

如果你的教授希望你只使用 eof(),那么尝试解决错误检查。解决方案可能是使用特殊值,并假设如果读取操作没有将值设置为其他值,那么它就会失败,并跳出循环。例如,读取前设置IDLONG_MAX,读取后确保不是LONG_MAX

毕竟 - 只需在小型工作数据集上在调试器下运行代码,逐步查看会发生什么。让自己熟悉调试器,并练习故障排除技巧。这肯定会在您的整个职业生涯中为您节省大量时间。

另见 - http://www.cplusplus.com/reference/iostream/ifstream/

祝你好运!

关于c++ - 在c++中读取文件时fstream无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9643666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com