c – 第一个索引后未填充的Struct Array索引

我有一个输入文件,每行有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;
}

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

#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 );
}

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

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

点赞