fgets()与fscanf()区别

二者都是读文件操作函数

首先为了测试两个读文件操作函数的区别

我们先写入文件几个数:

void write_file() {

	FILE* fp = fopen("test01.txt", "w");
	if (!fp) {

		perror("fopen error");
		return -1;
	}
	fprintf(fp, "%d\n", 10);
	fprintf(fp, "%d\n", 8);
	fprintf(fp, "%d\n", 6);

	fclose(fp);

}

查看文件

 测试fscanf 函数读入文件

void read_file2() {

	int a;
	FILE* fp = fopen("test01.txt", "r");
	if (!fp) {

		perror("fopen error");
		return -1;
	}
	while (1) {
	
		fscanf(fp, "%d\n", &a);
		
		if (feof(fp))  // 真 读到文件末尾
			break;
		printf("%d\n", a);
	}
	fclose(fp);
}

运行结果如下:

为何不能从文件中读到整数6呢? 

因为fscanf函数每次调用时都会判断下一次调用是否匹配参数2 如果不匹配会提前结束读文件

当读到6时判断下一次调用\n 与参数2 不匹配 所以提前结束读文件 。

如果想要在控制台输出6 需要将打印函数 放在结束读文件代码之前 

void read_file2() {

	int a;
	FILE* fp = fopen("test01.txt", "r");
	if (!fp) {

		perror("fopen error");
		return -1;
	}
	while (1) {
	
		fscanf(fp, "%d\n", &a);
		printf("%d\n", a);
		if (feof(fp))  // 真 读到文件末尾
			break;
		//printf("%d\n", a);
	}
	fclose(fp);
}

而利用fgets()函数读文件,需要将打印输出函数放在结束读文件代码之后。

void read_file3() {

	int a;
	char buf[1024];
	FILE* fp = fopen("test01.txt", "r");
	if (!fp) {

		perror("fopen error");
		return -1;
	}
	while (1) {

		//memset(buf, 0, 1024);
		fgets(buf, 1024, fp); //读 字符串
		//printf("%s", buf);
		if (feof(fp))  // 真 读到文件末尾
			break;
		printf("%s", buf);
	}
	fclose(fp);
}

如果打印函数放在结束读文件代码之前,且buf不被清空,则会在结束读文件操作之前,多打印一个缓存在buf中的数据

程序运行结果如下:

此外 fscanf()函数要求读入符合其参数2格式的数

而fgets()函数 除了函数的参数不同 之外,不管文件中什么格式的数都会以字符串的形式读取到。

为了测试这一条:我们手动将test01.txt中加入3个空格

 主函数中 执行read_file2()

程序运行结果中,控制台不会输出与参数2 格式不符的 空格字符

 而执行read_file3();

程序运行结果 控制台会输出读到的空格字符

猜你喜欢

转载自blog.csdn.net/weixin_56067923/article/details/128561266