C语言中的文件和文件操作

news/2025/2/26 4:43:26

文件操作

  • 一、文件的打开和关闭
  • 二、文件的顺序读写
    • fgetc和fputc
    • fgets和fputs
    • fscanf和fprintf
    • sscanf和sprintf
    • fread和fwrite
  • 三、文件的随机读写
    • 1.fseek
    • 2.ftell
    • 3.rewind
  • 四、补充
    • 1.文件读取结束的判定
    • 2.文件缓冲区

一、文件的打开和关闭

流和标准流
流:想象为流淌着字符的河。
C语言程序在启动时,默认打开stdin\stdout\stderr这三个标准流。
文件指针:FIFE*

//打开文件
FIFE* fopen(const char* filename,const char* mode);
//关闭文件
int fclose(FIFE* stream);

mode表示文件的打开方式。
这里我只列举几种常见的方式:

文件使用方式含义
r:只读为了输入数据,打开一个已经存在的文本文件
w:只写为了输出数据,打开一个文本文件,若文件不存在则新建一个
a:追加向文本文件尾添加数据
  • 只读创建文件方式:

在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述
添加刚才的text.txt。

二、文件的顺序读写

下面说的所有输入流一般适用于标准输入流和其他输入流(如文件输入流);以此类推输出流。
注意:虽然按照我编写的顺序都是将输入(读)放在前面,但实际应用时应写写入数据创建文件后,才能成功读出数据。

fgetc和fputc

字符输入函数和输出函数,使用于所有输入/出流
在这里插入图片描述
fputc:要写入的字符int提升。

int main()
{
	FIFE* pf = fopen("test.txt","w");
	if(pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	char ch = 0;
	for(ch='a';ch<='z';ch++)
	{
		fputc(ch,pf);
	}	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
fgetc的返回值为int,当位于文件末尾或读取错误时会返回EOF(-1)。

	//读文件
	int ch = 0;
	while((ch = fgetc(pf)) != EOF)
	{
		printf("%c",ch);
	}

fgets和fputs

文本行输入/出函数,适用于所有输入/出流
在这里插入图片描述
直到到达终止字符\0停止复制。

	fputs("hello world\n",pf);//\n也会展现出来
	fputs("hello!",pf);

在这里插入图片描述
换行符会使 fgets 停止读取,但它被函数视为有效字符,并包含在复制到 str 的字符串中。

	//读文件
	char arr[20] = {0};
	while(fgets(arr,20,pf) != NULL)
	{
		printf("%s",arr);
	}

这里num表示一次读取的最大字符数,注意即使小于字符串个数,相当于多读取几次但是获取的结果还是完整的。

fscanf和fprintf

格式化输入函数和输出函数,适用于所有输入/出流
在这里插入图片描述
在format参数之后,该函数至少需要与format指定的相同数量的附加参数。

struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "张三", 20, 65.5f };
	//想把s中的数据存放在文件中
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件 - 是以文本的形式写进去的
	fprintf(pf, "%s %d %f", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));

sscanf和sprintf

分别用于从字符串读取格式化的数据和将格式化的数据写入字符串,这两个函数不直接适用于文件流或标准输入/输出流(如 stdin 和 stdout),但可以用于处理字符串数据,这些字符串可以来源于文件读取或任何其他来源。
在这里插入图片描述
缓冲区的大小应该足够大,以包含整个结果字符串。
在这里插入图片描述

int main()
{
	char buf[200] = { 0 };
	struct S s = { "张三", 20, 65.5f };
	sprintf(buf, "%s %d %f", s.name, s.age, s.score);
	printf("1以字符串的形式: %s\n", buf);//1

	struct S t = {0};
	sscanf(buf, "%s %d %f", t.name, &(t.age), &(t.score));
	printf("2按照格式打印  : %s %d %f\n", t.name, t.age, t.score);//2
	return 0;
}

fread和fwrite

二进制输入、输出,适用于文件输入/出流
在这里插入图片描述
返回成功写入的元素个数。

int main()
{
	int arr[] = { 1,2,3,4,5 };
	FILE*pf = fopen("test.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写数据
	int sz = sizeof(arr) / sizeof(arr[0]);
	fwrite(arr, sizeof(arr[0]), sz, pf);//以二进制的形式写进去的
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述
这时test.txt文件里的数据是看不懂的,因为是二进制文件,下面打印出来观察。
在这里插入图片描述

int main()
{
	int arr[5] = { 0 };

	FILE* pf = fopen("test.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读数据-以二进制的形式写进去的
	int i = 0;
	while (fread(&arr[i], sizeof(int), 1, pf))//或用for循环逐个打印
	{
		printf("%d ", arr[i]);
		i++;
	}

	fclose(pf);
	pf = NULL;

	return 0;
}

这样打印出1 2 3 4 5 正常。

三、文件的随机读写

1.fseek

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。
int fseek ( FILE * stream, long int offset, int origin );
这里的origin有三种可能:分别是SEEK_SET(开始),SEEK_CUR(当前光标),SEEK_END(末尾)。
注:当从后先前移动光标时,偏移量为负数。

2.ftell

返回文件指针相对于起始位置的偏移量。
long int ftell ( FILE * stream );
eg:可用于求字符串长度等。

3.rewind

让文件指针的位置回到文件的起始位置。
void rewind ( FILE * stream );
eg:可用于不必记录直接回到指针起始位置等。

四、补充

1.文件读取结束的判定

feof,不能原来判断文件是否结束,作用:判断文件读取结束时,是否是因为遇到文件尾。

  • 文本文件:
    fgetc判断是否为EOF,fgets判断返回值是否为NULL。
  • 二进制文件:
    判断返回值是否小于实际要读的个数。
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读取
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c\n", ch);
	}
	//判断是什么原因导致读取结束的
	if (feof(pf))
	{
		printf("遇到文件末尾,读取正常结束\n");
	}
	else if (ferror(pf))
	{
		perror("fgetc");
	}
	return 0;
}

2.文件缓冲区

在这里插入图片描述
数据优先送到内存中的缓冲区,装满后一起送到磁盘上…
推荐学习网站,方便查找函数:链接: cpluscplus


http://www.niftyadmin.cn/n/5867159.html

相关文章

面试八股文--数据库基础知识总结(2) MySQL

本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库&#xff08;Relational Database&#xff09;是一种基于关系模型的数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;它将数据存储在表格&#xff08;表&#xff09;中&#xff0c;并通过表格…

Ubuntu DeepSeek磁盘空间不够解决办法

标签&#xff1a; Ubuntu&#xff1b; DeepSeek磁盘空间不够解决办法&#xff1b;Ubuntu 22, DeepSeek R1 671 B, solution for Insufficient Disk Space 问题&#xff1a;Ubuntu 22&#xff0c; DeepSeek R1 671B 磁盘空间不够解决办法 Ubuntu 22.04操作系统&#xff0c;台式…

基于keepalived实现haproxy高可用站点

Keepalived起初是为LVS设计的&#xff0c;专门用来监控集群系统中各个服务节点的状态&#xff0c;后来有加入VRRP的功 能&#xff0c;VRRP是Virtual Router Redundancy protocol&#xff08;虚拟路由器冗余协议&#xff09;的缩写&#xff0c;VRRP出现的目的就 是为了解决静态路…

基于javaweb的SpringBoot社区维修平台设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

图解前馈神经网络(FNN)

目录 ​编辑 1.前馈神经网络介绍 2.网络结构 3.模型工作示例 4.总结 1.前馈神经网络介绍 前馈神经网络&#xff08;Feedforward Neural Network&#xff0c;FNN&#xff09;是一种最简单、最经典的神经网络结构&#xff0c;它是人工神经网络的基础形式之一。 前馈神经网络…

忽略Git文件的修改,让它不被提交

使用Git托管的工程中&#xff0c;经常有这样的需求&#xff0c;希望文件只是本地修改&#xff0c;不提交到服务端。 如果仅仅是本地存在的文件&#xff0c;我们可以通过.gitignore配置避免文件被提交。 有的时候文件是由git托管的&#xff0c;但是我们希望只在本地修改&#…

运行 Rancher 的建议

运行在多个节点上的多个 Rancher 实例确保了单节点环境无法实现的高可用性&#xff0c;所以在生产环境或者一些很重要的环境中部署 Rancher 时&#xff0c;应该使用至少有三个节点的高可用 Kubernetes 集群&#xff0c;并在这个集群上面安装 Rancher。 在专用的集群上运行 Ran…

【Linux网络】序列化、守护进程、应用层协议HTTP、Cookie和Session

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、序列化和反序列化2、守护进程2.1 什么是进程组&#xff1f;2.2 什么是会话&#xff1f; 3、应用层协议HTTP3.1 HTTP协议3.2 HT…