C sscanf(fscanf)行与行的行为不同

时间:2015-05-22 21:44:37

标签: c scanf

我有这段代码应该从输入文件中读取文本并将其放在结构中。

void load(FILE *fin, struct camion payload[]){
        int i=0;
        char except;
        char buf[1000];
        while (fgets(buf,sizeof(buf),fin)){
                except='A';
                sscanf(buf,"%i-%i-%i %i %s %c",&payload[i].day,&payload[i].    month,&payload[i].year,&payload[i].nparcels,payload[i].origin,&except);
                if (except=='E')
                        payload[i].except=1;
                i++;
        }
}

fgets可以正常工作(测试它),但fscanf从这个文件开始:

01-01-2013      354     hub_J
01-01-2013      109     hub_L
03-01-2013      129     hub_J
04-01-2013      265     hub_J
08-01-2013      488     hub_B
09-01-2013      127     hub_J
09-01-2013      136     hub_K
09-01-2013      97      hub_D
10-01-2013      369     hub_O
11-01-2013      455     hub_G
12-01-2013      125     hub_I   E
13-01-2013      105     hub_O
13-01-2013      468     hub_C
13-01-2013      360     hub_H   E

返回(打印功能不是问题,执行sscanf时问题就出现了):

1- 1-2013 354 hub_J  
1- 1-2013 109 hub_L  
3- 1-2013 129 hub_J  
4- 1-2013 265 hub_J  
0- 0-   0 0   
0- 0-   0 0   
0- 0-   0 0   
0- 0-   0 0   
10- 1-2013 369 hub_O  
11- 1-2013 455 hub_G  
12- 1-2013 125 hub_I E
13- 1-2013 105 hub_O  
13- 1-2013 468 hub_C  
13- 1-2013 360 hub_H E

带E的行意味着超大有效载荷,因此E并不总是存在,但这不应该是错误。 我正撞在墙上。 提前谢谢

1 个答案:

答案 0 :(得分:4)

使用%i进行扫描,使用前导零值进行扫描,假定为八进制。 0809不是八进制值。使用%d代替前导零,并且值在基数10中 对于sscanf你可以试试这个。它将扫描所有行中的五个项目。 %n说明符将为您提供扫描处理的字符。然后,您可以测试buf[offset]。如果有换行符,则处理整个字符串。否则字符串会有更多,第二个sscanf可以捕获剩余的字符 免责声明:我没有编译和测试此代码。

void load(FILE *fin, struct camion payload[]){
    int i=0;
    int offset=0;
    char except;
    char buf[1000];
    while (fgets(buf,sizeof(buf),fin)){
        except='A';
        if ( ( sscanf(buf,"%d-%d-%d %d %s%n"
        ,&payload[i].day
        ,&payload[i].month
        ,&payload[i].year
        ,&payload[i].nparcels
        ,payload[i].origin
        ,&offset)) == 5) {
            if ( buf[offset] != '\n') {
                sscanf(buf+offset, " %c", &except);
            }
        }
        if (except=='E') {
            payload[i].except=1;
        }
        i++;
    }
}