【c语言】玩转文件操作

news2024/11/14 13:57:03

🌟🌟作者主页:ephemerals__

🌟🌟所属专栏:C语言

目录

引言

一、文件的打开和关闭

1.流

2.标准流

3.文本文件和二进制文件

4.控制文件打开与关闭的函数

二、文件的顺序读写

三、文件的随机读写

1.fseek函数

2.ftell函数

3.rewind函数

四、文件读取结束的判定

总结


引言

        我们在写程序的时候,往往会将数据存放在变量当中。如果程序退出,内存回收,这些数据就会丢失。那么我们是否有办法对这些数据进行持久化的保存,再次打开程序时数据仍然存在?答案是肯定的。而能够做到这件事的就是:文件操作

一、文件的打开和关闭

1.流

        程序的数据需要输出到外部设备,也需要从外部设备输入。对于不同设备,输入输出方式各有不同。为了方便我们在对各种输入输出设备进行操作,就有了“流”这一高度抽象的概念。在c语言中,对文件,画面,键盘等的输入输出操作都是同过“流”进行的。在一般情况下,我们想要写入数据或者读取数据,都需要打开流。

2.标准流

        c语言程序在启动的时候,默认有三个流已经为我们打开:

stdin--标准输入流,绝大多数情况下从键盘输入。

stdout--标准输出流,绝大多数情况输出至显示器上。

stderr--标准错误流,绝大多数情况输出至显示器上。

正因为这三个流已经默认打开,所以我们使用scanf、printf等函数就可以直接进行输入输出操作。

这三个流也是具有类型的,它们的类型是:文件指针(FILE*)。我们在进行文件操作的时候,通过文件指针变量就可以间接找到与它关联的文件

3.文本文件和二进制文件

        根据数据的组织形式,数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件
        如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件
        ⼀个数据在文件中是怎么存储的呢?
        字符⼀律以ASCII形式存储,数值型数据既可以以ASCII形式存储,也可以使用二进制形式存储。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符⼀个字节),而二进制形式输出,则在磁盘上只占4个字节。

4.控制文件打开与关闭的函数

        在了解了这些前置知识之后,我们切入正题--打开文件和关闭文件。c语言提供了两个函数,它们分别负责文件的打开和关闭,原型如下:

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

fopen函数有两个参数,第一个参数是以字符串形式表示的文件名,第二个参数是文件的打开方式,用字符串表示。这个函数在使用的时候我们需要创建一个文件指针变量来接收,当文件打开失败时,它会返回空指针。关于打开方式,在这里一一列举:

打开方式含义如果指定的文件不存在
“r”(只读)
为了输⼊数据,打开⼀个已经存在的⽂本⽂件
返回空指针
“w”(只写)
为了输出数据,打开⼀个⽂本⽂件
建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件返回空指针
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件返回空指针
“w+”(读写)为了读和写,建立一个新的文本文件建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写建⽴⼀个新的⽂件
“rb+”(读写)为了读和写打开⼀个⼆进制⽂件返回空指针
“wb+”(读写)
为了读和写,建立⼀个新的⼆进制⽂件建⽴⼀个新的⽂件
“ab+”(读写)
打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件

对于fclose函数,它的参数是文件指针,用于关闭这个文件指针指向的文件。

接下来,我们尝试打开和关闭一个文件:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)//文件打开失败则退出程序
	{
		perror("fopen");
		return 0;
	}
	printf("文件打开成功\n");
	fclose(pf);
	pf = NULL;//避免出现野指针,及时制空
	return 0;
}
运行结果:

可以看到,由于打开方式是“w”,该路径下确实出现了一个名为“test.txt”的文件。

二、文件的顺序读写

        接下来介绍几个函数,用于在文件当中读取或者写入数据

函数名功能适⽤于
fgetc字符输⼊函数所有输⼊流
fputc字符输出函数所有输出流
fgets⽂本⾏输⼊函数所有输⼊流
fputs⽂本⾏输出函数所有输出流
fscanf格式化输⼊函数所有输⼊流
fprintf格式化输出函数 所有输出流
fread⼆进制输⼊⽂件输⼊流
fwrite⼆进制输出⽂件输出流

接下来我们尝试使用一下fscanffprintf函数:

这两个函数的第一个参数是一个文件指针,用于对文件数据进行读取和写入操作。之后的参数与scanf、printf函数相同。

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.txt", "w");//要写入数据,以写的形式打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	fprintf(pf, "123456");//向文件中写入数据
	fclose(pf);
	pf = NULL;
	return 0;
}

可以看到,数据已经写入到文件当中了。接下来我们使用fscanf函数将文件数据打印到屏幕上:

#include <stdio.h>

int main()
{
	char str[20] = { 0 };
	FILE* pf = fopen("test.txt", "r");//要读取数据,以读的形式打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	fscanf(pf, "%s", str);//读取数据到str当中
	printf(str);
	fclose(pf);
	pf = NULL;
	return 0;
}
运行结果:

三、文件的随机读写

1.fseek函数

        fseek函数的作用是根据文件指针的位置和偏移量来定位文件指针。它的原型如下:

int fseek ( FILE * stream, long int offset, int origin );

它的第一个参数是文件指针,第二个参数是相对于设置位置的偏移量,第三个参数是设置的位置。

c语言定义了三个,可选择其中一个作为第三个参数:

SEEK_SET:文件的起始位置

SEEK_CUR:文件指针当前的位置

SEEK_END:文件的末尾

定位了文件指针之后,我们就可以在文件的指定位置处进行读取或者写入操作了。

2.ftell函数

        ftell函数用于返回文件指针相对于起始位置的偏移量。函数原型:

long int ftell ( FILE * stream );

3.rewind函数

        rewind函数用于将文件指针的位置回到文件的起始位置。它的函数原型:

void rewind ( FILE * stream );

四、文件读取结束的判定

        1.对于文本文件,我们首先可以使用fgetc函数循环读取文件中的字符,直到读到EOF为止,说明文件读取结束

        2.对于二进制文件,我们使用fread函数判断其返回值:是否小于实际要读的个数。如果小于,则说明读取结束。

        对于以上两种情况,文件读取结束时,我们可以继续判断文件读取结束的原因。介绍两个函数:feofferror

        feof函数用于判断文件读取结束的原因是否是遇到文件尾。它的原型如下:

int feof ( FILE * stream );

如果文件由于读取到文件末尾而读取结束,则返回EOF;如果是其他情况,则会返回0。

        ferror函数用于判断文件读取结束的原因是否是出现I/O错误。原型如下:

int ferror ( FILE * stream );

如果文件由于出现I/O错误而读取结束,则返回非0值;其他情况则返回0。

接下来我们尝试写一段代码对文件读取结束进行判断:

#include <stdio.h>

int main()
{
	int c = 0;
	FILE* fp = fopen("test.txt", "r");
	if (fp == NULL)
	{
		perror("fopen");
		return 0;
	}
	while ((c = fgetc(fp)) != EOF)//返回EOF则读取结束
	{
		putchar(c);
	}
	//判断读取结束的原因
	if (ferror(fp))
		puts("I/O错误\n");
	else if (feof(fp))
		puts("文件读取结束\n");
	fclose(fp);
	fp = NULL;
	return 0;
}

总结

        今天我们学习了文件操作相关的知识,了解了文件的打开关闭,写入数据或者从文件读取数据的方法,以及调整文件指针的函数,还有对文件读取结束的判定。如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1907432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

收银系统源码-次卡功能

智慧新零售收银系统是一套线下线上一体化收银系统&#xff0c;给门店提供了含线下收银称重、线上商城、精细化会员管理、ERP进销存、营销活动、移动店务助手等一体化行业解决方案&#xff01; 详细功能见下文&#xff1a; 门店收银系统源码-CSDN博客文章浏览阅读2.6k次&#…

猫咪浮毛太多怎么处理?6年铲屎官最值得买的猫毛空气净化器分享

作为一位拥有6年铲屎经验的铲屎官&#xff0c;家中既有宝宝又有毛孩子的铲屎官家庭来说&#xff0c;空气中的宠物异味和猫毛不仅影响生活质量&#xff0c;更关乎家人的健康。普通空气净化器虽然能够提供基本的空气净化&#xff0c;但对于养猫家庭的特定需求&#xff0c;如去除宠…

PHP宝藏神器多功能投票系统源码小程序

&#x1f389;发现宝藏神器&#xff01;一键解锁“多功能投票小程序”的无限可能✨ &#x1f308; 开篇安利&#xff1a;告别繁琐&#xff0c;拥抱高效&#xff01; Hey小伙伴们&#xff0c;是不是经常为组织活动、收集意见而头疼不已&#xff1f;&#x1f92f; 今天就要给大…

融云入驻首个数字生态出海基地,加速构建数字经济出海创新生态

7 月 3 日&#xff0c;“2024 全球数字经济大会”重要专题论坛“2024 数字生态出海发展论坛”在北京国家会议中心举行。 论坛由全球数字经济大会组委会主办&#xff0c;北京市经济和信息化局、北京市政务服务和数据管理局、大兴区人民政府共同承办。来自阿联酋、日本、古巴、…

挖到宝了,一个可自动根据设定兴趣主题爬取实时信息的AI挖掘工具。

在这个信息爆炸的时代&#xff0c;我们每天都被海量的资讯淹没。 无论是工作需要还是个人兴趣&#xff0c;我们都希望能够及时获取到最新、最有价值的信息。然而&#xff0c;手动搜索、筛选这些信息不仅耗时耗力&#xff0c;还常常让人感到疲惫。 今天&#xff0c;我给大家推…

【Python】Python中TODO的用法解析

目录 一.Python中的TODO是什么 二.Python中什么时候使用TODO 三.Pycharm中关于TODO的使用方式 一.Python中的TODO是什么 在Python中&#xff0c; TODO 通常不是一个语言内置的关键字或功能&#xff0c;而是被用作一种注释约定&#xff0c;来标记代码中需要进一步实现或改进的…

【Linux】touch

我们在介绍ls这个命令时&#xff0c;提到每个文件在Linux下面都会记录许多的时间参数&#xff0c;其实是有三个主要的变动时间&#xff0c;那么三个时间的意义是什么&#xff1f; 修改时间&#xff08;modification time&#xff0c;mtime)&#xff1a;当该文件的【内容数据】…

mongoDB教程(五):命名规范

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

香蕉云编+uniapp打包ios的开发包和生产包

登录香蕉云编&#xff0c;找到 云编-ios证书生成&#xff0c;新建CSR文件&#xff0c;并下载csr文件。 登录苹果开发者中心&#xff0c;进入证书页面。 1.创建一个证书&#xff0c;选择ios Distribution类型即可&#xff0c;这是个通用的证书&#xff0c;既能用来打正式包又能…

想要做好非标设备行业的项目管理,这篇指南请收好!

近年来&#xff0c;随着制造业的快速发展和产业升级的不断推进&#xff0c;非标设备行业迎来了广阔的发展前景。一方面&#xff0c;制造业的快速发展带来了对非标设备的旺盛需求&#xff0c;尤其是在汽车、电子、航空航天等高端制造业领域&#xff0c;非标自动化设备的应用越来…

协议转换网关的工作原理-天拓四方

在当今数字化和网络化的社会中&#xff0c;不同系统和设备之间的通信至关重要。然而&#xff0c;由于技术多样性、厂商差异以及应用需求的复杂性&#xff0c;不同的系统和设备常常采用不同的通信协议&#xff0c;这使得它们之间的直接通信变得困难。为了解决这一问题&#xff0…

解决线程不安全问题的几种方式

线程不安全问题 日常生活中我们会经常碰到在不同的平台上买各种票的问题&#xff0c;例如在App、线下售票窗口等购买火车票、电影票。这里面就存在着线程安全的问题&#xff0c;因为当多个线程访问同一个资源时&#xff0c;会导致数据出错&#xff0c;例如甲和乙两人同时看中了…

深度解析:当下流行的人工智能大模型生成逻辑

在过去的几年里&#xff0c;人工智能领域经历了前所未有的革新&#xff0c;其中最引人注目的就是大规模预训练模型的崛起。这些模型&#xff0c;如GPT系列、BERT、T5、DALLE和CLIP等&#xff0c;凭借其强大的语言理解和生成能力&#xff0c;已经在自然语言处理&#xff08;NLP&…

ctfshow(web入门-信息搜集)

1.web1 直接F12查看即可 2.web2 根据提示使用抓包工具 3.web3 根据提示使用burp抓包&#xff0c;然后参数使用repeater模块进行发送 4.web4 根据提示先访问robots 5.web5 6.web6 使用dirsearch 即可www.zip 7.web7 8.web8 9.web9 10. web10 11.web11 12.web12 根据提示在底…

wordpress的restfull API使用教程,之如何用postman调试API,以便能使用vue等前端框架开发主题

文章目录 API开发手册在postman中调试这里以 post 一篇文章为例&#xff0c;讲解如何调试&#xff1a; 步骤 1&#xff1a;生成应用密码步骤 2&#xff1a;配置Postman步骤 3&#xff1a;创建文章 参考链接 API开发手册 官方API手册&#xff1a;https://developer.wordpress.o…

京东技术团队撰写的整整986页《漫画学Python》到底有什么魅力?

这是一本Python入门书。无论您是想学习编程的小学生&#xff0c;还是想参加计算机竞赛的中学生&#xff0c;抑或是计算机相关专业的大学生&#xff0c;甚至是正在从事软件开发的职场人&#xff0c;本书都适合您阅读和学习。但您若想更深入地学习Python并进行深层次应用&#xf…

07.C2W2.Part-of-Speech (POS) Tagging and Hidden Markov Models

往期文章请点这里 目录 OverviewPart of Speech TaggingMarkov ChainsMarkov Chains and POS TagsPOS tags as StatesTransition probabilitiesThe transition matrixInitial probabilities Hidden Markov ModelsEmission probabilitiesSummary Calculating ProbabilitiesTran…

【实习问题记录】Nodeclub本地部署

问题描述 在按照官方网站给出的教程一步一步操作以后发现出现以下报错&#xff1a; 问题分析 显示连接不上mongodb&#xff0c;分析报错可能是因为版本不匹配导致的&#xff0c;查看安装的mongodb版本发现是7.0.4&#xff0c;与目标版本不匹配&#xff0c;同时查看mongodb官…

C#写的winform项目无法打包发布?谈谈思路

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

一款简单、免费的web文件共享服务器

#共享文件# #远程访问# #手机访问# 文件共享已成为我们日常生活和工作中不可或缺的一部分。它如同一条无形的纽带&#xff0c;将人们紧密地联系在一起&#xff0c;促进了信息的快速传播和交流。 文件共享的魅力在于其打破了地域和时间的限制。无论我们身处世界的哪个角落&…