首页 文章

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

提问于
浏览
3

使用这种结构:

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 回答

  • 6

    主要问题是 "%[^\n]," . "%[^\n]" 扫描除 '\n' 以外的所有内容,因此 ',' 扫描 description . 当遇到逗号时,代码需要停止扫描到 description .

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

    char buf[100];
    if (fgets(buf, sizeof buf, file) == NULL) Handle_EOForIOError();
    

    然后扫描它 . 使用 %39[^,] 不扫描 ',' 并将宽度限制为39 char .

    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();
    

    [编辑]

    简化:@ user3386109

    更正:@cool-guy删除&

  • 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 .

相关问题