Jak*_*ake 3 c++ file-io while-loop eof
输入文件
Miller Andrew 65789.87 5
Green Sheila 75892.56 9
Sethi Amit 74900.50 6.1
Run Code Online (Sandbox Code Playgroud)
ifstream inFile;
ofstream outFile;
string laastName;
string firstName;
double salary;
double percent;
double new Salary;
double increase;
inFile.open("Ch3_Ex6Data.txt");
outFile.open("Ch3_Ex6Output.dat");
while(!inFile.eof()) {
inFile >> lastName;
inFile >> firstName;
inFile >> salary;
inFile >> percent;
percent /= 100;
increase = salary * percent;
newSalary = increase + salary;
outFile << firstName << " " << lastName << " ";
outFile << setprecision(2) << fixed << newSalary << endl;
}
inFile.close();
outFile.close();
return 0
}
Run Code Online (Sandbox Code Playgroud)
输出文件
Andrew Miller 69079.36
Sheila Green 82722.89
Amit Sethi 79469.43
Amit Sethi 74946.19
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么最后一行输出两次并且为什么它与第一行不同?我不明白为什么循环会继续下去。文件结尾标记没有命中吗?我能够通过放入索引变量并通过说 && 小于索引将第二个条件放入 while 循环中来对其进行硬编码,但我觉得好像我不必这样做。
问题是它eof并没有按照你的想法去做。
想象一下,您正在地板上行走,一块又一块地砖,捡起地板上的东西,将其放入口袋中并显示(打印)您口袋中的内容。
当你把脚放在最后一块瓷砖上时,地板还没有“结束”,你的鼻子仍然安全。你还没有砸碎墙壁。你填满口袋并打印它们。
eof,然后,告诉你什么时候你的鼻子被打破,而不是什么时候瓷砖是最后的。
所以,你在最后一块瓷砖上,检查一下你的鼻子,发现没问题,然后向前迈出一步。你的鼻子现在在流血,我们的口袋里没有任何东西可以偷看,而你的口袋里仍然装着……他们以前拥有的东西。
你打印口袋里的东西(再次),然后检查你的鼻子。它坏了:你退出。
解决该问题的惯用方法是:
while(inFile >> lastName
>> firstName
>> salary
>> percent)
{
//all your computation here
}
Run Code Online (Sandbox Code Playgroud)
我想你自己应该明白为什么。