我已经开始研究一个程序了,对于我的生活,我找不到一个不断搜索eof并且不会结束的错误。这肯定是我的fileread和widthcount函数的问题,并且它们很可能具有相同的错误。有没有解决这个问题?它只是不断循环。
文件输入是
12.43 62.38 Los Angeles
21 59 Columbus, Ohio
0 15.58 Green Bay, Wisconsin
这将持续另外10行。
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <iomanip>
using namespace std;
void fileread(ifstream &ifFile, char newline, double &temp1, double &temp2, string city);
void widthcount(ifstream &ifFile, int &maxCount, char newline);
int main() {
double temp1, temp2, minTemp, maxTemp;
int maxCount;
char newline=' ';
string FileRead, city;
ifstream ifFile;
cout << "Please enter the location of the input file: ";
cin >> FileRead;
ifFile.open(FileRead.c_str());
if (ifFile.fail()) {
perror(FileRead.c_str());
exit(1);
}
widthcount(ifFile, maxCount, newline);
while(!ifFile.eof()) {
widthcount(ifFile, maxCount, newline);
}
ifFile.close();
ifFile.open(FileRead.c_str());
fileread(ifFile, newline, temp1, temp2, city);
while(!ifFile.eof()) {
fileread(ifFile, newline, temp1, temp2, city);
cout << left << setw(20) << city
<< right << setw(6) << fixed << setprecision(2) << temp1
<< right << setw(6) << fixed << setprecision(2) << temp2 << endl;
}
}
void fileread(ifstream &ifFile, char newline, double &temp1, double &temp2, string city) {
int charcount = 0;
ifFile >> temp1 >> temp2;
while (newline == ' ')
ifFile.get(newline);
while (newline != '\n' || !ifFile.eof()) {
charcount++;
ifFile.get(newline);
}
}
void widthcount (ifstream &ifFile, int &maxCount, char newline) {
double temp1, temp2;
int charcount = 0;
ifFile >> temp1 >> temp2;
ifFile.get(newline);
while (newline != '\n' && !ifFile.eof()) {
charcount++;
ifFile.get(newline);
cout << newline;
}
if (charcount > maxCount)
maxCount = charcount;
}
答案 0 :(得分:3)
您需要检查失败(测试.fail()
),而不是文件结尾。
通常直接使用流对象作为条件来检查.fail()
。
E.g。 while( f )
相当于while( !f.fail() )
。
答案 1 :(得分:0)
专门检查eof()
几乎总是一个错误 - 例如,如果在到达文件末尾之前遇到其他错误,eof
将保持为假,但读取将失败(但是由于eof
仍为假,您的循环将继续尝试永久读取和失败。
就个人而言,我的代码结构有点不同。我首先创建一个结构来表示一个&#34;记录&#34;来自文件:
struct city {
double temp1, temp2; // horrible names, but I don't know what they represent.
std::string name;
};
然后我重载operator>>
以从流中提取一个城市的数据,并operator<<
显示城市的数据:
std::istream &operator>>(std::istream &is, city &c) {
is >> c.temp1 >> c.temp2;
std::getline(is, c.name);
return is;
}
std::ostream &operator<<(std::ostream &os, city const &c) {
return cout << left << setw(20) << c.name
<< right << setw(6) << fixed << setprecision(2) << c.temp1
<< right << setw(6) << fixed << setprecision(2) << c.temp2;
}
然后我会用这些来读取和写入数据(按算法):
int main(int argc, char **argv) {
// For the moment, cheat and take the file name from the command line
std::ifstream ifFile(argv[1]);
std::copy(std::istream_iterator<city>(ifFile),
std::istream_iterator<city>(),
std::ostream_iterator<city>(std::cout, "\n"));
return 0;
}
顺便说一句,我注意到虽然您致电 widthcount
,但您似乎从未使用任何结果。至少就目前而言,我已经跳过了做类似的事情,因为它并没有影响结果。
答案 2 :(得分:0)
你应该尝试像
这样的东西double t1,t2;
string s1,s2;
ifstream ifs;
ifs.open(Filename.c_str());
ifs>>t1>>t2>>s1>>s2;
while(ifs)
{
.......
do the calculations
.......
ifs>>t1>>t2>>s1>>s2;
}
这适用于所有情况。如果在第一次读取后,ifs
进入失败状态,则将跳过文件读取的其余部分,并执行while
循环后的行。其他明智的,其余的行将在循环中读取。您可以根据是否要读取字符串,字符或行来更改您的要求。