1
int k;
float regionID;
int t;
char string[100];
float avgTemp,totalTemp;
for(k = 0; k < MAX_STATIONS; k++){
    if (fgets(string, sizeof(string), fp) == 0){
        break;
    }
    fscanf(fp,"%d %f %d %d %d %d %d %f %f %f", &stationInfo[k].stationID, &stationInfo[k].temperature, &stationInfo[k].year, &stationInfo[k].month, &stationInfo[k].day, &stationInfo[k].hour, &stationInfo[k].minute, &stationInfo[k].location.latitude, &stationInfo[k].location.longitude, &regionID);
    printf("%d %1.2f %d %d %d %d %d %f %f\n", stationInfo[k].stationID, stationInfo[k].temperature, stationInfo[k].year, stationInfo[k].month, stationInfo[k].day, stationInfo[k].hour, stationInfo[k].minute, stationInfo[k].location.latitude, stationInfo[k].location.longitude);

}

所以,我的程序几乎完美地读取了我的文件,但它不会读取我文件的第一行。任何人都知道可能导致此问题的原因以及我如何解决它?

4

2 回答 2

4

您在这里非常有意地阅读并丢弃了一行:

if (fgets(string, sizeof(string), fp) == 0) {

我认为您的意思是使用sscanf而不是fscanf,以便您使用返回给您的数据fgets

sscanf(string,"%d %f %d %d %d %d %d %f %f %f", ... );
于 2013-11-11T22:50:09.667 回答
1

您的程序“不读取文件的第一行”的原因是因为它实际上已经在您调用时读取了第一行

if (fgets(string, sizeof(string), fp) == 0)

解决此问题的更改很简单:

for(k = 0; k < MAX_STATIONS; k++)
{
    if (fscanf(fp,"%d %f %d %d %d %d %d %f %f %f", &stationInfo[k].stationID,
                                                   &stationInfo[k].temperature,
                                                   &stationInfo[k].year,
                                                   &stationInfo[k].month,
                                                   &stationInfo[k].day,
                                                   &stationInfo[k].hour,
                                                   &stationInfo[k].minute,
                                                   &stationInfo[k].location.latitude,
                                                   &stationInfo[k].location.longitude,
                                                   &regionID) > 10)
    {
        break;
    }
    printf("%d %1.2f %d %d %d %d %d %f %f\n", stationInfo[k].stationID,
                                              stationInfo[k].temperature,
                                              stationInfo[k].year,
                                              stationInfo[k].month,
                                              stationInfo[k].day,
                                              stationInfo[k].hour,
                                              stationInfo[k].minute,
                                              stationInfo[k].location.latitude,
                                              stationInfo[k].location.longitude);
}

注意 fscanf 的返回值:

成功时,该函数返回参数列表中成功填充的项目数。由于匹配失败、读取错误或到达文件结尾,此计数可以与预期的项目数匹配或更少(甚至为零)。

希望这就是你要找的!

于 2013-11-11T23:00:00.503 回答