fscanf()读取带有格式化行中空格的字符串

时间:2015-02-25 04:42:46

标签: c scanf

使用此结构:

typedef struct sProduct{
  int code;
  char description[40];
  int price;
};

我想用这种格式读取一个txt文件:

1,Vino Malbec,12

格式为:code,description,price。但是当它有一个空格时,我在阅读描述时遇到了问题。

我试过了:

fscanf(file,"%d,%[^\n],%d\n",&p.code,&p.description,&p.price);

正在保存代码,但是当我只保存Vino Malbec,12因为Vino Malbec是价格时保存说明12

有任何帮助吗? 谢谢!

2 个答案:

答案 0 :(得分:6)

主要问题是"%[^\n],""%[^\n]"'\n'以外的所有description扫描,因此','扫描description。遇到逗号时,代码需要停止扫描char buf[100]; if (fgets(buf, sizeof buf, file) == NULL) Handle_EOForIOError();

使用面向行的文件数据,第一次读取1行。

%39[^,]

然后扫描它。使用','不扫描char并将宽度限制为39 int cnt = sscanf(buf,"%d , %39[^,],%d", &p.code, p.description, &p.price); if (cnt != 3) Handle_IllFormattedData();

" %n"

另一个好玩的技巧是:使用int n = 0; sscanf(buf,"%d , %39[^,],%d %n", &p.code, p.description, &p.price, &n); if (n == 0 || buf[n]) Handle_IllFormattedData_or_ExtraData(); 来记录解析的结束。

{{1}}

[编辑]

简化:@ user3386109

更正:@cool-guy删除&

答案 1 :(得分:1)

@chux已就此发布了一个很好的答案,但如果您需要使用fscanf,请使用

if(fscanf(file,"%d,%39[^,],%d",&p.code,p.description,&p.price)!=3)
    Handle_Bad_Data();

此处,fscanf首先扫描一个数字(%d)并将其放入p.code。然后,它扫描逗号(并丢弃它),然后扫描最多39个字符或直到逗号并将所有内容放入p.description。然后,它扫描逗号(并丢弃它),然后扫描一个数字(%d)并将其放入p.price