结构数组索引在第一个索引后未填充

时间:2014-12-08 07:47:01

标签: c++ arrays loops struct fstream

我有一个输入文件,每行有3个字段,类型为:string,double,double。有15行数据。

输入文件数据的格式为:

加德满都,-34,28
cityName,lowTemp,highTemp
.... ...... ..

很明显,根据输出,它没有获得第3个输入。

以下是代码:

for (int index = 0; index < 15; index++)
    {
        getline(inFile, weatherInfo[index].city, ',');
        inFile >> weatherInfo[index].low >> weatherInfo[index].high;
        inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');   
    }

出于某种原因,这是我的输出:

Katmandu (-34, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)

我知道我的程序能够读取其他行,因为我添加

inFile.ignore(20);

到我的陈述的开头它输出的循环

28
Perth (92, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)

输出代码:

void ShowAll(int count)                                         //Show entire data function
{

int x = 0;                                                  //loop through the index of city[], lowTemp[], highTemp[], and print them.
while (x < count)
{
    cout << weatherInfo[x].city << " (" << weatherInfo[x].low << ", " << weatherInfo[x].high << ")" << endl;

    x++;

}

cout << endl;
}

1 个答案:

答案 0 :(得分:2)

如果一行中的数据用逗号分隔,那么您应该使用以下方法

#include <sstream>

//...

std::string line;

for ( int index = 0; index < 15 && std::getline( inFile, line ); index++)
{
    std::istringstream is( line );

    getline( is, weatherInfo[index].city, ',');

    std::string field;
    if ( getline( is, field, ',') ) weatherInfo[index].low = std::stod( field );
    if ( getline( is, field, ',') ) weatherInfo[index].high = std::stod( field );
}

您的代码存在的问题是,当您尝试读取double值并遇到逗号时会发生错误。在这种情况下,流的状态将是错误的,所有其他输入将被忽略。

此外,您应该检查您正在使用的语言环境中双打的点表示。