gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:26:16 25 4
gpt4 key购买 nike

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

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 并不总是存在,但这不应该是错误。我用头撞墙。提前致谢

最佳答案

使用 %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++;
}
}

关于C sscanf (fscanf) 行与行的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30406319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com