file i / o infinite loop c ++ eof

时间:2012-10-26 02:16:16

标签: c++ debugging file-io console-application

我已经开始研究一个程序了,对于我的生活,我找不到一个不断搜索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;
}

3 个答案:

答案 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循环后的行。其他明智的,其余的行将在循环中读取。您可以根据是否要读取字符串,字符或行来更改您的要求。