如何从文件中读取特定格式的数据?

我应该从类似于这种格式的文件中读取输入和参数:

Add  id:324  name:"john" name2:"doe" num1:2009 num2:5 num2:20

问题是我不允许使用fgets.我尝试使用fscanf,但不知道如何忽略“:”并分隔字符串’name:“john”’.

解决方法

如果您确定输入文件将是格式良好,非常特定的格式,fscanf()始终是一个选项,并将为您完成大量工作.下面我使用sscanf()代替只是为了说明而不必创建文件.您可以更改调用以使用fscanf()作为您的文件.

#define MAXSIZE 32
const char *line = "Add  id:324  name:\"john\" name2:\"doe\" num1:2009 num2:5 num3:20";
char op[MAXSIZE],name[MAXSIZE],name2[MAXSIZE];
int id,num1,num2,num3;
int count =
    sscanf(line,"%s "
        "id:%d "
        "name:\"%[^\"]\" "  /* use "name:%s" if you want the quotes */
        "name2:\"%[^\"]\" "
        "num1:%d "
        "num2:%d "
        "num3:%d ",/* typo? */
        op,&id,name,name2,&num1,&num2,&num3);
if (count == 7)
    printf("%s %d %s %s %d %d %d\n",op,id,num3);
else
    printf("error scanning line\n");

输出

Add 324 john doe 2009 5 20

否则,我会手动解析一次读取一个字符的输入,或者如果出于任何原因使用fgets()不允许,则将其抛入缓冲区.让它缓冲比恕我直言更容易.然后你可以使用其他函数,如strtok()和诸如此类的解析.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...