使用此结构:
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
。
有任何帮助吗? 谢谢!
答案 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
。