当前位置: 首页 > news >正文

【C语言】文件操作scanf,fscanf,sscanf(第二弹)

上次【C语言】文件操作超细的!(第一弹)_tt142的博客-CSDN博客

已经简单的介绍了文件的相关知识,下面具体来讲一下函数

目录

1.printf,fprintf,sprintf

2.scanf,fscanf,sscanf

1.printf,fprintf,sprintf

printf是我们很熟悉的函数,他是把数据打印到屏幕上,针对的是标准输出流

fprintf,针对文件,对于所有输出流都适用,把数据格式化之后输出到文件里

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{

	FILE* p = fopen("text.txt", "r");
	if (p == NULL)
	{
		return 1;
	}
	
	int ch=fgetc(p);
	if (ch!= EOF)
	{
		//putchar(ch);
		printf("%c\n", ch);
	}
	fclose(p);
	p = NULL;

	return 0;
}

int main()
{
	int a = 2;
	printf("%d\n", a);


	FILE*p=fopen("text.txt", "w");
	if (p == NULL)
	{
		return 1;
	}
	char arr[] = "abc";
	if (1==fprintf(p, "%s", arr))
	{
		printf("success\n");
	}
	else
	{
		if (feof(p))
		{
			printf("end\n");
		}
		else if(ferror(p))
		{
			printf("in\n");
		}
	}

	fclose(p);
	p = NULL;

	return 0;
}

我们会看到

 

 

注意在写fprintf的时候,这个函数是有返回值

 

如果成功写入,会返回写入的总数量,我们这里写进了一个字符串

 补充:

在判断返回值是否为1的时候,我们写了函数feof

注意:feof不能直接判断是否到文件末,而是当文件结束的时候到底是因为文件末还是异常结束!

所以对于fgetc这样的读取失败返回文件末的函数,应该用feof判断一下返回值是否为EOF

 

int main()
{

	FILE* p = fopen("text.txt", "r");
	if (p == NULL)
	{
		return 1;
	}
	
	int ch=fgetc(p);
	if (ch!= EOF)
	{
		//putchar(ch);
		printf("%c\n", ch);
	}
	fclose(p);
	p = NULL;

	return 0;
}

而fgets

如果遇到文件末尾,会返回EOF,此时应该用feof判断

如果在一开始就读到end-of-file,后面还有可读的字符,那文件指针会被置空,并且没读到的字符不会被改变(显然),如果读取过程中就遇到了错误,那么用ferror(专门判断在读取过程中遇到错误的函数),文件指针依旧会被置空,但是此时这个指针指到的字符就会被改变!!

我们知道,文件指针起始指向第一个字符,每读取一次就会自动后移一个位置 

 

sprintf,针对字符串,也只适用于字符串,把数据格式化之后输出到字符串里

int main()
{
	FILE* p = fopen("text.txt", "w");
	if (p == NULL)
	{
		return 1;
	}
	fprintf(p, "%s", "abc");
	fclose(p);
	p = NULL;

	 p = fopen("text.txt", "r");

	char ans[5];
	sprintf(ans,"%c%c",fgetc(p), fgetc(p));

	fclose(p);
	p = NULL;

	return 0;
}

2.scanf,fscanf,sscanf

和上三个函数差不多

scanf,键盘的数据输入到键盘缓冲区,函数从缓冲区拿数据

fsacnf,从文件缓冲区中拿数据,格式化,输入到指定类型的变量中

sscanf,从字符串中拿数据,格式化,输入到指定类型的变量

int main()
{
	FILE* p = fopen("text.txt", "r");
	if (p == NULL)
	{
		return 1;
	}

	char ch[6]={0};
	fscanf(p, "%c", &ch[0]);
	printf("%c", ch[0]);

    char arr[6]={0};
	sscanf(&ch[0], "%c", &arr[0]);
	printf("%c\n", arr[0]);


	fclose(p);
	p = NULL;

	return 0;
}

文件缓冲区

我们前面说的fscanf和fprintf不是直接从文件里读数据到变量,或者写入文件,而是所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。

从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。

如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。

缓冲区的大小根据C编译系统决定的。

相关文章:

  • 普宁17网站一起做网店/软文推广收费
  • 织梦cms如何搭建网站/关键字搜索
  • 做淘宝banner的网站/今日国内热点新闻头条事件
  • 网页设计学校网站制作/百度指数总结
  • wordpress下载付费/河南新站关键词排名优化外包
  • 网站建设产品/凡科建站代理
  • 广义表基础
  • 【数据结构】------ 堆
  • 踩内存问题定位手段汇总
  • 高中物理基础学习笔记一
  • 【ICLR 2023】Diffusion Models扩散模型和Prompt Learning提示学习:prompt-to-prompt
  • 计算机毕业设计JAVA基于微服务架构的设备管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw
  • 信安软考 第二十五章 移动应用安全需要分析与安全保护工程
  • 基于A*算法的多机器人图形路径规划解决策略(Matlab代码实现)
  • FreeRTOS 任务通知浅析
  • 【docker】docker的基础命令
  • 忘记密码找不回?不存在的:python自动解密解码,简直异常轻松~
  • #预处理和函数的对比以及条件编译