(C语言)文件操作

目录

文件

程序文件

数据文件

文件名

​编辑数据文件的分类

文件的打开和关闭

标准流

1)stdin

2)stdout

3)stderr

文件指针

文件的打开和关闭

对文件内容操作的函数

1)fgetc,fputc

2)fputs

 3)fgets

4)fprintf

5)fscanf

6)sprintf

7)fread,fwrite

文件的随机读写

1)fseek

 2)ftell,remind

文件读取结束的判定


我们存储的文件指是磁盘(硬盘)上的文件,放在硬盘上可以将数据进行持久化的保存

但是在程序设计时,我们通常谈到两种文件:程序文件和数据文件

文件

程序文件

1)源程序文件:后缀是.c的文件;

2)目标文件:windows环境后缀是.obj(在编译和链接中会专门讲解);

3)可执行文件:windows环境后是.exe;

数据文件

数据文件的内容不一定是程序,而是程序运行时读写的数据;比如,程序运行需要从中读取的数据文件,或输出内容的文件;

文件名

一个为了将要有唯一的文件标识,便于查找文件;

文件名包含三个部分:1)文件路径;2)文件主干;3)文件后缀;

数据文件的分类

 根据数据的组织形式,数据文件被分为二进制文件和文本文件;

1)二进制文件:数据在内存中以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件;

2)文本文件:如果要求在外存文件上以ASCII码值的形式存储,则需要在存储前进行转化,以ASCII码值的形式存储的文件叫做文本文件;

注意:储存的时候,字符一律以ASCII码值的形式存储,数值型数据可以以ASCII码值的形式存储,也可以以二进制的形式存储

比如:10000,如果以二进制输出到磁盘上,则在磁盘上只占4个字节;如果以ASCII码值进行输出,每个字符一个字节,则需要5个字节;

文件的打开和关闭

如何用C语言打开一个文件;

我们程序的数据需要输出到 各种外部设备 ,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念;
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。

专门用来将文件和不同的外部设备建立关系;

文件的打开就是:1)打开文件(打开流);2)读写文件;3)关闭文件(关闭流)

标准流

我们在键盘上输入数据,向屏幕输出数据的时候,好像并没有看见打开了文件(流);因为在C语言程序启动时会默认打开3个标准流

1)stdin

标准输入流,在大多数环境从键盘输入,scanf函数就是从标准输入流中提取数据;

2)stdout

标准输出流,在大多数环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中;

3)stderr

标准错误流,大多数环境中输出(程序错误)到显示器界面;

stdin,stdout,stderr三个流的类型:FILE*,是一个文件指针

文件指针

文件指针是用来管理流的;

每一个被使用的文件(在硬盘上)都在内存中开辟了一个相应的文件信息区(在内存中),用来存储文件的相关信息,这些信息被保存在一个结构体变量中,该结构体的类型是由系统声明的,取名为FILE;

一般用FILE*的指针来维护FILE结构变量;

定义一个FILE*的指针相当于找到了文件的地址;

文件的打开和关闭

1)打开文件;2)读取文件;3)关闭文件;

在ANSI C标准中,规定用fopen来打开文件;

filename是指的是打开的文件名称,mode是文件打开的形式;

关闭文件用fclose;

关闭文件后,要把文件指针置为空指针;

后面会讲解对文件进行写操作;

注意:路径包含绝对路径和相对路径两种,这里就不再讲解了;

对文件内容操作的函数

1)fgetc,fputc

fgetc函数,形式:int fgetc(FILE* stream);从流中读取一个字符,当读取成功时,返回这个字符的ASCII码值,当读取错误的时候,返回EOF

fputc函数,形式:int fputc(int character,FILE* stream);将字符输出到流中;

2)fputs

fputs是用来将一串字符输出到文件中的;输出成功返回一个非负数,输出失败返回EOF

 3)fgets

fgets是拷贝函数;将流中的数据,拷贝最多num个倒str地址处;返回值是拷贝完成的起始地址;

可以看到记事本中的字符确实拷贝到了arr数组中,但是num是10,为什么只拷贝了9个?因为在使用fgets的时候会默认最后一个补'\0'上去,所以减少了一位字符的拷贝;若拷贝内容中含有换行符,则拷贝到换行符后自动停止拷贝;

4)fprintf

 

可以看到,printf和fprintf 的区别在于fprintf多了一个FILE* stream所以fprintf是把信息写在文件上的,而不是输出到屏幕上

5)fscanf

 与fprintf类似,fscanf不是从标准输入流中读取,而是从指定的stream流中读取;

6)sprintf

sprintf是将格式化的数据写到字符串中,即将格式化的数据转换成字符串;

将name字符串和c整形数据转化为字符串放在arr中;

7)sscanf

sscanf和sprintf的作用相反,其是将字符串转化成格式化数据;

sscanf是从arr地址开始读的,不是从键盘上读取;

7)fread,fwrite

fread和fwrite可以进行二进制的读写;

fread是将ptr地址处count个大小为size的元素以二进制的方式写入stream流中;

要用二进制的方式打开才能看到里面的数据,记事本不是以二进制的方式打开;

fread是从流中以二进制的方式读取num个size大小的数据放在str地址处,与fwrite相反,此处不再赘述了;

文件的随机读写

在进行对文件的操作的时候,文件中光标在时刻移动;在对文件进行读写的时候,我们又是不希望它从起始位置开始,此时我们就需要改变光标的起始位置。

1)fseek

fseek函数是专门用来改变文件光标的起始位置的;

从origin开始偏移量为offset(可以是负数)

origin有三种,文件起始位置,当前位置,末尾;

 2)ftell,remind

 ftell是用来告诉你此时文件指针(光标)位置的,其返回文件相对于起始位置的偏移量;

rewind是重置光标位置的,让文件指针(光标)位置回到起始位置;

文件读取结束的判定

判断方法:

1)文本文件读取是否结束,判断返回值是否是EOF(fgetc),或者NULL(fgets)

2)二进制文件的读取结束判断,判断fread的返回值是否小于要读取的个数

注意:feof是用来判断文件读取结束的原因是否是遇到了文件末尾,而不是判断文件是否读取结束;当读取到文件末尾,则返回一个非0值;

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

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

相关文章

低代码开发平台搭建思考与实战

什么是低代码开发平台? 低代码开发平台是一种平台软件,人们能通过它提供的图形化配置功能,快速配置出满足各种特定业务需求的功能软件。 具有以下特点: 提供可视化界面进行程序开发0代码或少量代码快速生成应用 什么是低代码产…

Axure设计之日期时间范围选择器

在产品设计和原型制作过程中,日期时间范围选择器是一个常见的需求。Axure作为一个强大的原型设计工具,能够帮助我们快速实现这一功能。通过利用Axure的动态面板、中继器、文本框、按钮以及时间函数,我们可以轻松制作一个功能完备的日期时间范…

汽车资讯新趋势:Spring Boot技术解读

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 汽车资讯网站的系统管理员可以管理用户,可以对用户信息修改删除审核以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 汽车品牌管理 系统管理员可以汽车品牌信息进行添加&#xf…

代码随想录第三十七天

52.携带研究材料 题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同…

[开源] 告别黑苹果!用docker安装MacOS体验苹果系统

没用过苹果电脑的朋友可能会对苹果系统好奇,有人甚至会为了尝鲜MacOS去折腾黑苹果。如果你只是想体验一下MacOS,这里有个更简单更优雅的解决方案,用docker安装MacOS来体验苹果系统。 一、项目简介 项目描述 Docker 容器内的 OSX&#xff08…

redis延时队列

引入 <redisson.version>3.15.5</redisson.version><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>${redisson.version}</version></dependency>…

「四」体验HarmonyOS端云一体化开发模板——工程目录结构与云侧工程一键部署AGC云端

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

241121学习日志——[CSDIY] [InternStudio] 大模型训练营 [11]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…

STM32完全学习——使用SysTick精确延时(阻塞式)

一、SysTick相关寄存器 首先关于SysTick寄存器的数据在下面这个文件里面可以找到&#xff0c;平时那个数据手册是没有的。其次我这边使用的开发板是F407的开发板&#xff0c;关于这个寄存器的数据都是来自下面这个文件的截图&#xff0c;一般只会用到这3个寄存器。 二、使用标…

理解加密:常见算法及其应用

在信息安全领域&#xff0c;加密技术被广泛用于保护数据的机密性。加密的核心目的是将明文信息转化为密文&#xff0c;以防止未经授权的访问和数据泄露。本文将介绍几种常见的加密算法&#xff0c;包括对称加密、非对称加密和哈希算法&#xff0c;并提供 C# 代码示例&#xff0…

【机器学习】- 模型复杂度vs模型误差

目录 0.引言1.模型复杂度vs模型误差1.1. 模型误差的分类1.2 模型复杂度与误差的关系1.3 偏差-方差权衡&#xff08;Bias-Variance Tradeoff&#xff09;1.4 可视化&#xff1a;误差与复杂度1.5 如何选择模型复杂度&#xff1f;1.6 总结 2.方差描述含义&#xff1a;2.1 方差的定…

大数据调度组件之Apache DolphinScheduler

Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 主要特性 易于部署&#xff0c;提供四种部署方式&#xff0c;包括Standalone、Cluster、Docker和…

什么是SEO中的博客评论?

博客评论通过为其他网站提供价值来帮助你建立反向链接。 例如&#xff0c;你在你的网站上发布烘焙技巧。你可以在一个很受欢迎的食谱博客上评论巧克力饼干的帖子&#xff1a; “多么美味的食谱啊&#xff01;”为了防止饼干在烤箱里散开&#xff0c;试着在烘烤前将面团冷却至…

插件元器件焊接错了该怎么处理指南!!!

前言&#xff1a;编写不易&#xff0c;请勿搬运&#xff0c;仅供学习&#xff01;&#xff01;&#xff01; 目录 插件引脚焊接标准 ​编辑 板子不平如何焊接插件 电烙铁快速焊接插件 焊接把过孔封住怎么办 焊接插件元器件焊错了怎么处理 电烙铁焊接贴片 插件引脚焊接标准…

高级java每日一道面试题-2024年11月18日-基本篇-Java创建对象有几种方法?

如果有遗漏,评论区告诉我进行补充 面试官: Java创建对象有几种方法? 我回答: 在 Java 中&#xff0c;创建对象有多种方法。以下是常见的几种方法及其详细解释&#xff1a; 1. 使用 new 关键字 这是最常见的创建对象的方法。通过调用类的构造方法来创建对象。 MyClass ob…

【软考】系统架构设计师-信息安全技术基础

信息安全核心知识点 信息安全5要素&#xff1a;机密性、完整性、可用性、可控性、审查性 信息安全范围&#xff1a;设备安全、数据安全、内容安全、行为安全 网络安全 网络安全的隐患体现在&#xff1a;物理安全性、软件安全漏洞、不兼容使用安全漏洞、选择合适的安全哲理 …

【Node.js】Node.js 和浏览器之间的差异

Node.js 是一个强大的运行时环境&#xff0c;它在现代 JavaScript 开发中扮演着重要角色。然而&#xff0c;许多开发者在使用 Node.js 时常常会感到困惑&#xff0c;尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异&#xff0c;帮助你全面理解两者的设计…

用Python爬虫“偷窥”1688搜索词推荐:一场数据的奇妙冒险

在这个信息爆炸的时代&#xff0c;数据就像是藏在深海里的宝藏&#xff0c;等待着勇敢的探险家去发掘。今天&#xff0c;我们将化身为数据海盗&#xff0c;用Python作为我们的船只&#xff0c;航向1688的海域&#xff0c;去“偷窥”那些神秘的搜索词推荐。准备好了吗&#xff1…

【Redis】redis缓存击穿,缓存雪崩,缓存穿透

一、什么是缓存&#xff1f; 缓存就是与数据交互中的缓冲区&#xff0c;它一般存储在内存中且读写效率高&#xff0c;提高响应时间提高并发性能&#xff0c;如果访问数据的话可以先访问缓存&#xff0c;避免数据查询直接操作数据库&#xff0c;造成后端压力过大。 但是可能会面…

全面解析:HTML页面的加载全过程(一)--输入URL地址,与服务器建立连接

用户输入URL地址&#xff0c;与服务器建立连接 用户在浏览器地址栏输入一个URL 浏览器开始执行以下三步操作操作&#xff1a;url解析、DNS查询、TCP连接 第一步&#xff1a;URL解析 什么是URL&#xff1f; URL(Uniform Resource Locator&#xff0c;统一资源定位符)是互联网…