fscanf读取失败的问题

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

结果已经没有问题,但是我们进入了几次循环呢?

第一次处于开头,进入循环

        获取第一行,打印第一行

第二次循环,文件流处于第一次结尾,

        获取第二行,打印第二行

第三次循环,文件流处于第二次结尾,

        获取第三行,打印第三行

在判断的时候,是结尾了,退出。

所以进入了三次循环

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值