在将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);
答案 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。