1、之前记过一期fgetc的问题,使用fgetc多读了一个乱码字符,需要提前获取返回值
2、使用fscanf的时候,还遇见过两个问题
1、中文显示乱码
解决方法:使用notepad++打开对应文件
选择编码-选择ansi编码,可以系统打印中文乱码的问题。
2、使用fscanf获取文本,打印输出的时候发现重复循序打印第一行的错误
void login()
{
FILE* file;
file = fopen("password.txt", "r");
if (!file) {
puts("open fail.");
exit(0);
}
char login_name[20];
char login_pswd[20];
char name[20];
char pswd[20];
int ret = 0;
p1:
puts("输入你的账号:");
scanf("%s", name);
puts("输入你的密码:");
scanf("%s", pswd);
getchar();
fflush(stdin);
//fscanf(file, "%s %s", login_name, login_pswd);
while(!feof(file))
{
fscanf(file, "%s %s", login_name, login_pswd);
if (!strcmp(name, login_name) && !strcmp(pswd, login_pswd))
{
ret = 1;
break;
}
puts("test");
}
if (ret)
{
puts("登录成功");
}
else {
puts("登录有问题");
puts("输入y:继续,其他退出。请输入:");
char select;
select = getchar();
if (select == 'y') {
fseek(file, 0, SEEK_SET);
goto p1;
}else{
puts("输入有问题,你又不愿意重新尝试,只能退出");
exit(0);
}
}
fclose(file);
}
使用fscanf获取文本,打印输出的时候发现重复循序打印第一行的错误
fscanf(stu, "学号:%s 姓名:%s 性别:%s 成绩:%s", id, name, sex, score);
while(!feof(stu)){
printf("学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
fscanf(stu, "学号:%s 姓名:%s 性别:%s 成绩:%s", id, name, sex, score);
}
打印:
学号:1 姓名:nike 性别:man 成绩:90
学号:1 姓名:nike 性别:man 成绩:90
学号:1 姓名:nike 性别:man 成绩:90
学号:1 姓名:nike 性别:man 成绩:90
学号:1 姓名:nike 性别:man 成绩:90
学号:1 姓名:nike 性别:man 成绩:90
E:\C\visualStudio\demo\game1\x64\Debug\game1.exe (进程 37132)已退出,代码为 -1073741510。
按任意键关闭此窗口. . .
系统为什么重复打印第一行????
因为没有识别换行嘛,fscanf没有识别换行,fscanf后加上\n
while(!feof(stu)){
fscanf(stu, "学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
printf("学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
}
结果正常打印
2、只打印两行的问题
fscanf(stu, "学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
while(!feof(stu)){
printf("学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
fscanf(stu, "学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
}
1
打开成功
学号:1 姓名:nike 性别:man 成绩:90
学号:2 姓名:adidas 性别:woman 成绩:95
#其他方法验证:使用for循环还是可以打印,所以是自己的判断的条件的问题
fscanf(file, "学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
for (int i = 0; i < 3; i++)
{
printf("学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
fscanf(file, "学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
}
#思考:
feof的判断条件到底是什么,函数feof()在到达给出的文件流的文件尾时返回一个非零值.
这里的话,
1、fscanf读完,文件流到达第一行结尾
while第一次循环,feof识别不是结尾,返回0,!0进入循环
打印第一行,获取第二行
2、第二次循环,文件流到达第二行结尾
feof识别不是文件尾巴,返回0,!0进入循环
打印二行,获取第三行
3、第三次,文件流已经到达结尾了,退出
#所以我们想要继续用fscanf就要修改我们的代码了,不要提前读
提前读取的话进入两次循环
fscanf(stu, "学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
while(!feof(stu)){
printf("学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
fscanf(stu, "学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
}
****************************************
1
打开成功
学号:1 姓名:nike 性别:man 成绩:90
学号:2 姓名:adidas 性别:woman 成绩:95
修改后
while(!feof(stu)){
fscanf(stu, "学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
printf("学号:%s 姓名:%s 性别:%s 成绩:%s\n", id, name, sex, score);
}
****************************************
1
打开成功
学号:1 姓名:nike 性别:man 成绩:90
学号:2 姓名:adidas 性别:woman 成绩:95
学号:3 姓名:jack 性别:man 成绩:100
结果已经没有问题,但是我们进入了几次循环呢?
第一次处于开头,进入循环
获取第一行,打印第一行
第二次循环,文件流处于第一次结尾,
获取第二行,打印第二行
第三次循环,文件流处于第二次结尾,
获取第三行,打印第三行
在判断的时候,是结尾了,退出。
所以进入了三次循环