使用fscanf时检查有效输入

时间:2013-09-24 13:34:03

标签: c linked-list

我想知道在扫描文件内容时是否有办法检查文件输入是否有效。

例如,如果我要扫描名为filename的文件,我希望该文件包含未定义数量的包含5个元素的集合,即Name,Sex,Age,Height和Weight。我将为该程序创建一个链接列表。

所以我将创建typedef Struct:

typedef struct nodebase{
    char name[20];
    char sex; //M for male and F for female
    int age;
    double height; // Height shall be rounded off to 2 decimal points
    double weight; // Weight shall be rounded off to 2 decimal points
    struct nodebase *next;
}listnode;

int main()
{
    int totalsets; //Counter for total numbers of "sets" within the file
    char filename[20];
    listnode *head;
    listnode *tail;
    listnode *current;
    FILE *flist;

    printf("Type the name of the file for the list: \n");
    scanf("%s",filename);

然后在扫描文件中所有可能的“集合”时,

flist = fopen(filename,"r");
while(!feof(flist))
{
    if(5 == fscanf(flist,"%s[^\n]%c%d%lf%lf",&current->name,&current->sex,&current->age,&current->height,&current->weight)
{
    totalsets++;
}

(这是我的问题):如何让程序告诉用户某些文件输入是否错误(但程序仍会计入那些有效的“套”)?

就像文件有一个包含整数的集合一样,当它应该是性别的字符时

另一个问题是,程序(在检测到这样的无效输入之后)是否可以接受用户的编辑并覆盖该集合的无效输入部分的编辑?

非常感谢你!

*我还没有完成整个编码。我被困在这里,所以我只是想在继续之前完成这部分。 *我的问题可能已有答案,但坦率地说,我不理解他们......

我在Windows上使用VS2012。

1 个答案:

答案 0 :(得分:1)

使用fgets()sscanf()

char buf[256];
while(fgets(buf, sizeof buf, flist) != NULL) {
  if(5 == sscanf(buf,"%19s %c%d%lf%lf", &current->name,...)   {
    totalsets++;
  }
}

某些格式更改:

"%s[^\n]"语法无效。无论如何%s都不会扫描\n 在分配性别之前使用" %c"消耗空格。

一般来说,你有一个语法问题:你的文件如何分开名字形式的性别?空格可能出现在名称中,也可能不出现。名称中可能包含多个空格。经典的习语是使用逗号分隔值,如下所示

  if(5 == sscanf(buf,"%19[^,] , %c ,%d ,%lf ,%lf", &current->name,...)   {