C ++ while循环问题

时间:2017-03-19 23:34:57

标签: c++ struct while-loop getline

我正在尝试将文件行(cityNamehiTemploTemp)读入结构数组。我能够使用>>来读取前几行,直到我找到一个有空格的城市。

然后我尝试使用getline()来读取行,但是 while 循环停止工作。

我不知道为什么会这样。

int LoadData()
{
int count = 0;
string path;


cout << "Specify the input file path: ";
ifstream inFile;
cin >> path;

inFile.open(path.c_str());

if (!inFile.is_open())
{
    cout << "Error - could not open file: " << path;

    return (-1);
}

else
{
    while (!inFile.eof())
    {

        cities[count].city = "";
        getline(inFile, cities[count].city);

        if (cities[count].city.length() == 0)
        {
            break;
        }

        char comma;
        inFile >> (cities[count].high) >> comma >> cities[count].low;
        cout << cities[count].city << " " << cities[count].high << " " << cities[count].low << endl;

        count++;

    }

    inFile.close();
    inFile.clear(std::ios_base::goodbit);
    return count;
}


}

2 个答案:

答案 0 :(得分:3)

使用getline作为循环条件。您也可以使用getline替换第二次阅读,并使用stringstream进行解析。

#include <sstream>
// ...
while(getline(inFile, cities[count].city)) {
  if (cities[count].city.empty()) break;
  // read next line with high and low values
  string str;
  if (!getline(inFile, str)) break; // error in file format
  stringstream ss(str);
  char comma;
  ss >> cities[count].high >> comma >> cities[count].low; // parse it
}

答案 1 :(得分:3)

while (!inFile.eof())

要获取文件中的每一行,您应该使用:

while(getline(inFile, cities[count].city)) {
    // ...

这是有效的,建议使用.eof()方法。

您也可以在if语句中使用它:

if (!getline(inFile, str)) 
    break;

顺便说一下,你可以阅读这个网站:

  

Why is “while ( !feof (file) )” always wrong? - StackOverflow帖子

它深入了解了为什么使用.eof() 而不是作为首选方法在while循环中使用以检查是否已到达文件结尾。