使用fscanf用符号解析数据

时间:2019-03-21 07:06:25

标签: c

在将if存储到文件时,我试图为输入插入分隔符,但出现错误。当我尝试插入空格时,似乎还可以。但是没有空间,仍然会出错。

这是我的代码,具有用于存储输入的student.name和student.pass的代码:

fprintf(fp, "%s %s\n", student.name, student.pass);
fclose(fp);

当我检查时:

while(fscanf(fp, "%s %s", &student.name, &student.pass) != EOF)
{
    printf("Username is %s : Password is %s\n", student.name, student.pass);
    if(strcmp(student.name, a)==0)
    {
        printf("Exists");
    }
    else
    {
        printf("Not Exists");
    }
}

输出:

name: name;
pass: pass;
Username is name : Password is pass;

可以很好地处理空间,但是我需要使用分隔符,因为当我尝试输入时:

name: my name;
pass: pass;
Username is my : Password is pass;
Username is name : Password is pass;

如何使用'|'分隔符解决此问题作为分隔符,我希望输入是否像这样:

fprintf(fp, "%s|%s\n", student.name, student.pass);
fclose(fp);

1 个答案:

答案 0 :(得分:2)

%s读取数据,直到遇到白色字符为止。因此,如果您使用的是这种数据格式,则数据将无法使用空间。

解决此问题的一种方法是更新数据格式并使用高级格式字符串(C样式代码):

int StudentWrite(FILE *f, Student *student) {
    return 2 == fprintf(f, "%s\n%s\n", student->name, student->pass);
}

int StudentRead(FILE *f, Student *student) {
    return 2 == fscanf(f, "%[^\n]%*c%[^\n]%*c", student->name, student->pass);
}

此格式字符串的工作方式如下:

  • %[^\n]读取所有字符,直到结束行\n
  • %*c读取单个字符并将其丢弃。由于以前的格式会读取所有字符,但不读取结尾字符,因此会读取并丢弃结尾字符。

要保护数据免受缓冲区溢出扫描格式字符串的影响,可以像这样:%80[^\n]%*c%80[^\n]%*c,其中80表示目标容量,例如student->name(请记住,您必须计算终止符为零,因此实际缓冲区的大小必须比该值大1。