0

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

3 回答 3

3

您需要检查失败(测试.fail()),而不是文件结尾。

通常.fail()通过直接使用流对象作为条件进行检查。

例如while( f )等价于while( !f.fail() )

于 2012-10-26T02:30:33.917 回答
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执行循环之后的行。否则,将在循环中读取其余行。您可以根据是否要读取字符串、字符或行来更改您的要求。

于 2012-10-26T03:56:30.567 回答
0

专门检查eof()几乎总是一个错误 - 例如,如果您在到达文件末尾之前遇到其他错误,eof将保持为假,但读取将失败(但由于eof仍然为假,您的循环将继续尝试读取并失败, 永远)。

就个人而言,我会以完全不同的方式构建代码。我首先创建一个结构来表示文件中的一个“记录”:

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,但您似乎从未使用过它的任何结果。至少目前,我已经跳过了类似的操作,因为它不会影响结果。

于 2012-10-26T02:43:35.803 回答