我对C ++很陌生,所以请耐心等待。我正在尝试编写一个程序来读取文件中的成绩,并将平均成绩和字母等级打印到文件中。我的输入文件有3行成绩,因此只能打印3行成绩。然而,我得到了第四行垃圾,但我无法弄明白为什么。我试过要求我的老师寻求帮助,但他告诉我的全部内容都是阅读这本书,但这并没有涵盖这个问题。有人可以解释一下吗?我真的很抱歉这么多代码,但我不确定什么可能是相关的。
grades.txt
76 67 83 49 1111111 75 85 70 90
92 87 91 73 0110101 85 95 100 95
98 91 95 87 1111101 100 100 100 95
const int NUMHOMEWORK=7;
const int NUMPROGRAMS=4;
const float MAXPROGRAMS=400.0;
const char ASCIICONVERT=0x0f;
int main(){
int exam, test1, test2, test3, testTotal, hwGrade, progTemp, finalGrade;
char hwTemp, letterGrade;
ifstream inData;
ofstream outData;
inData.open("grades.txt");
if (!inData){
cout<<"Cannot open the input file.";
return 1;}
outData.open("finalgrades.txt");
if (!outData){
cout<<"Cannot open the output file.";
return 1;}
while (inData){
int hwTotal=0;
int progTotal=0;
int i=0;
inData>>exam>>test1>>test2>>test3;
if (test1<test2 && test1<test3)
testTotal=test2+test3;
else if (test2<test1 && test2<test3)
testTotal=test1+test3;
else
testTotal=test1+test2;
do{
inData.get(hwTemp);
hwGrade=hwTemp&ASCIICONVERT;
if (hwGrade==1)
hwTotal=hwTotal+hwGrade;
i++;
} while (i<=NUMHOMEWORK);
i=0;
do{
inData>>progTemp;
progTotal=progTotal+progTemp;
i++;
} while (i<NUMPROGRAMS);
if (hwTotal==NUMHOMEWORK)
hwTotal--;
exam=((exam/100.0)+0.005)*25;
testTotal=((testTotal/200.0)+0.005)*40;
hwTotal=((hwTotal/6.0)+0.005)*10;
progTotal=((progTotal/MAXPROGRAMS)+0.005)*25;
finalGrade=exam+testTotal+hwTotal+progTotal;
if (90<=finalGrade)
letterGrade='A';
else if (80<=finalGrade<=89)
letterGrade='B';
else if (70<=finalGrade<=79)
letterGrade='C';
else if (60<=finalGrade<=69)
letterGrade='D';
else if (finalGrade<=59)
letterGrade='F';
outData<<exam<<" "<<testTotal<<" "<<hwTotal<<" "<<progTotal<<" "<<finalGrade<<" "<<letterGrade<<endl;
}
}
答案 0 :(得分:1)
您的i是从0开始的索引,以及以下行:
while (i<=NUMHOMEWORK);
一直计入NUMHOMEWORK(包括),因此你最终拥有NUMHOMEWORK + 1行 - 最后一行是垃圾。
答案 1 :(得分:1)
您还没有提供grades.txt,但这可能是正在发生的事情:
您的inData.get(hwTemp);
正在读取您在test3
的值之后的grades.txt中提供的空间。
一个快速解决方法是阅读并忽略该空间。例如,在第一个do
语句之前添加以下行:
inData.get(hwTemp);
这将读取空格并忽略它。
答案 2 :(得分:0)
你应该写......
while (inData >> exam >> test1 >> test2 >> test3)
...
...所以输入循环仅在实际输入完成时继续。在尝试输入之前只知道文件状态是否正常并不能保证输入可用。
同样,您应该检查inData.get()
和inData >> progTemp
操作是否有效(ala if (!inData) { std::cerr << "bad input\n"; exit(1); }
) - 或者您仍然可能因无效的输入文件而无法使用。