【C语言】文件操作(终卷)

news2024/11/16 18:05:37

前言

我们在上一卷中了解了顺序读写的函数,现在就让我们从随机读写的函数开始吧。

什么是随机读写?

就是想在哪个位置读或写都行,比较自由。文件打开时光标默认在起始位置。想从后面的某个部分读或写,就得让文件指针来到那个位置:

fseek函数

这个函数就能根据文件指针的位置和偏移量来定位文件指针(文件内容的光标,不是指FILE*类型的文件指针)。

 这个函数有3个参数,第一个是文件指针,第二个是偏移量,第三个指的是起始位置。毕竟,要给出从哪开始,偏移量是多少,才能随机读写。

 注意,offsetof可以为负数

最后一个参数origin有三种选项

第一个是文件的起始位置;第二个是文件指针(光标)当前的位置;第三个是文件的末尾。

请看下面的代码: 

 可以看到我们用fgetc两次读文件时,第一次结果是a,第二次是b,这说明什么?说明第二次读的时候我们的光标向后一移了一个字符。

 光标是一个个移动的,如果我们现在想直接读到e,就不能使用这种方式。

使用fseek定位到起始位置偏移量为4的位置也就是指向e的位置,再读,就得到了e。

 或者我们最后一个参数使用SEEK_END:

或者SEEK_CUR:

 

ftell函数

返回文件指针相较于起始位置的偏移量:

当我们读文件不知道读到哪了,偏移量是多少,就可以使用它。

我们分析一下偏移量为5:

 e读完后其实光标会移动到e的后一位也就是指向f。所以读完e算偏移量,就是5。

rewind函数

让文件指针的位置回到文件的起始位置。

我们使用完再读就是a:

文件结束的判定

被误解的函数 feof

EOF——end of file 文件结束标志

所以很多人以为feof是用来判断文件是否结束的。

实际上,它的作用是当文件读取结束的时候,判断读取结束的原因是否是遇到文件结尾。

在读取文件的过程中可能读取结束,结束的原因可能是确实遇到了文件末尾(读完了),也可能遇到了错误。那么为了判断,我们就可以使用feof。

feof负责判断是否是因为遇到文件末尾而结束的。而不是判断是否读取结束。

那么怎么判断是否读取结束呢?对于文本文件而言,用fgetc正常读到字符返回的是读到字符的ASCII码值,失败或读取结束会返回EOF;用fgets判断的话(一行一行读),读取失败或者读取结束返回NULL。 所以用fgetc去读判断是否为EOF,用fgets去读判断返回值是否为NULL,就能知道是否读取结束; 

而如果是以二进制的形式去读,返回值小于实际要读的个数就是读取结束的标志。(讲fread时提到过:参数count是一次读几个,如果返回值比num小,说明读取结束)

文本文件判定读取结束原因例子:

二进制文件判定读取结束原因的例子:

注意:没有读到文件结尾时,没有任何状态值被设置,feof的返回值会是0;如果读到文件末尾,返回非零值(一般为1)。

那ferror呢?没有错误时返回0,有错误时返回非零值(1)。那么什么时候会错呢?比如要写文件却以"r"打开文件,要读文件却以"w"形式打开,就会ferror返回1(但是这种情况perror打印不了正确的错误信息,可以自己编写一个错误信息)

 可以看到返回值部分的描述和feof是非常相似的。

文件缓冲区

程序数据区和硬盘之间的输入、输出并不是直接进行的,而是在中间还有一个文件缓冲区:

ANSIC标准采用“缓冲文件系统”处理数据⽂件,所谓缓冲文件系统是指系统自动地在内存中为程序中每⼀个正在使用的文件开辟⼀块“文件缓冲区”。

从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小是根据C编译系统决定的。

为什么要有文件缓冲区?

这就像你去找老师提问,一遇到一个问题就跑去问老师,一分钟去一次,老师时间就会被你占用,只能给你一个人解答;但如果你攒够多个问题再一起提问,老师就能腾出时间做别的事。

所以我们也不是有一个数据就写到硬盘上的,写数据不是直接就能写上去的,还要调用操作系统的接口,如果我们一有数据就写,总是打断操作系统;现在有了缓冲区,充满了再写入硬盘,操作系统就能做其他事,提高了效率。

观察缓冲区例子:

注意,第二次Sleep是因为文件关闭时也会刷新缓冲区,为了保证缓冲区的刷新不是因为关闭文件,延缓关闭文件。 

所以我们得出一个结论

因为有缓冲区的存在,C语言在操作文件时,需要刷新缓冲区或在文件操作结束时关闭文件,如果不这样做,可能导致读写文件的问题。

到此,文件操作的内容就结束了,祝阅读愉快^_^

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

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

相关文章

Linux系统Docker部署Apache Superset并实现远程访问详细流程

目录 前言 1. 使用Docker部署Apache Superset 1.1 第一步安装docker 、docker compose 1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透,实现公网访问 3. 设置固定连接公网地址 前言 作者简介: 懒大王敲代码&#xff0…

【小工具】电磨机

BUSCH DREMEL3000 博世 琢美 技术规范

儿童护眼灯什么牌子好点?五款儿童护眼灯品牌推荐

儿童护眼灯什么牌子好点?根据往年的统计,我国青少年近视率位居世界第一,儿童青少年总体近视率达到了52.7%。其中,6岁儿童的近视率为14.5%,小学生为36.0%,初中生为71.6%,高中生为81%。造成近视的…

事务与锁的顺序不对导致并发的问题

错误使用锁和事务导致并发 在事务中添加锁来解决并发的问题,这并没有解决并发的问题。 Transactional Override public void execute(){try {lock.lock()// 开启锁// 查询出数据mapper.select();// 根据查询出数据计算并写入到数据库中mapper.udpate()} finally {…

Java 中的 Map 集合:入门篇

在 Java 编程中,Map 是用于存储键值对。它提供了快速的查找和检索功能,是处理大量数据的理想选择。 本文将深入介绍 Java 中的 Map 集合,包括其基本概念、常见实现类、典型用法以及一些常见问题的解决方案。 1. Map 的基本概念 Map 是一种键…

#01 Stable Diffusion基础入门:了解AI图像生成

文章目录 前言什么是Stable Diffusion?Stable Diffusion的工作原理如何使用Stable Diffusion?Stable Diffusion的应用场景结论 前言 在当今迅速发展的人工智能领域,AI图像生成技术以其独特的魅力吸引了广泛的关注。Stable Diffusion作为其中的一项前沿技术&#…

2. keepalived结合LVS配合使用

keepalived结合LVS配合使用 1、后端nfs存储提供项目文件2、后端nfs上集中安装MySQL,共用数据库3、业务服务器通过LNMP正常部署wordpress博客,客户端通过DNS解析可正常访问4、所有业务服务器上修改arp参数、配置VIP5、配置keepalived实现LVS高可用5.1 kee…

【大学物理】期末复习双语笔记

3 vectors and scalar 20 damped harmonic motion,forced harmonic motion, superposition of SHM damped harmonic motion underdamped motion:欠阻尼 critical damped零界阻尼 over damped过阻尼 energy of damped harmonic motion application of damped oscillation:减震器…

Python的super方法两种调用方式解析

Python由于具有多继承的特点,因此在使用super()方法的时候,需要考虑调用的是哪个父类的方法,这里面涉及到以下内容: 菱形继承(钻石集成)MRO(method resolution order) 下面的图像就是菱形继承。 抛开复…

Spring 中如何控制 Bean 的加载顺序?

如果你脱口而出说添加 Order 注解或者是实现 Ordered 接口,那么恭喜,你掉坑了。 一 Order 注解和 Ordered 接口 在 Spring 框架中,Order 是一个非常实用的元注解,它位于 spring-core 包下,主要用于控制某些特定上下文…

va_start和va_end使用介绍

一 概述 采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎…

【Docker】学习笔记(超万字图文整理)

前言 再此感谢黑马程序员提供的Docker课程! 什么是Docker?看这一篇干货文章就够了! UPD: 补充更新微服务集群、Docker镜像仓库部分内容 所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验(无广告且清爽)&#…

ai写作神器app有哪些?好用的智能写作APP推荐

ai写作神器app有哪些?AI写作神器app在现代写作领域正迅速崭露头角,它们不仅极大提升了创作效率,而且通过集成前沿的人工智能技术,为创作者们提供了前所未有的便利。这些app能够智能分析写作需求,快速生成高质量的内容&…

PMP(项目管理)- PMBOK第七版重点解析

PMP(项目管理)- PMBOK第七版重点解析 本文内容是PMBOK第七版的重点章节精华提炼 参考资料内容:PMBOK第七版&PRINCE2第七版 参考资料在文末获取,关注我,分享优质前沿资料(IT、运维、编码、互联网…&a…

边缘计算的AI小板——OrangePi AI Pro

简介 OrangePi AI Pro是一款基于Allwinner H6处理器的嵌入式AI计算设备,适用于物联网和边缘计算。它具有强大的性能、低功耗、多接口和小尺寸。 本文分为三个部分: 一、对该板进行简单的开箱介绍。 二、 将SD卡中的系统迁移到由于该板支持SD卡、SSD…

Kong网关身份认证

认证的步骤: 启用认证插件。创建用户。给用户分配认证信息(扩展:账号密码 等)。请求时,带上认证信息。 key-auth: 创建用户: [rootlocalhost etc]# curl -i -X POST http://localhost:8001/consumers -…

【教程】如何实现WordPress网站降级(用于解决插件和主题问题)

在最新可用版本上运行WordPress安装、插件和主题是使用该平台的关键最佳实践。还建议使用最新版本的PHP。但是,在某些情况下,这是不谨慎或不可能的。 如果您发现自己处于这种情况,您可能需要撤消更新并降级您的WordPress网站(或其中的一部分)。幸运的是,有一些方法可用于…

数字逻辑电路交通信号灯控制器设计与multisim仿真

当今时代是一个自动化时代,交通灯控制等很多行业的设备都与计算机密切相关。因此,一个好的交通灯控制系统,将给道路拥挤、违章控制等方面给技术革新。随着大规模的集成电路及计算机技术的迅速发展,以及人工智能在控制技术方面的广泛运用,智能设备有了很大的发展,是现在科…

Systemd服务配置排坑-TasksMax参数

一、背景 由于产品是Java程序,之前都是通过封装的start.sh运行即可。但是出于架构调整,改换为Ansible进行自动化部署,同时改用Systemd service的方式来对程序进行管理。 但不知道为啥原因,使用systemctl启动这个程序,就…

如何优雅的解析多层JSON报文数据?什么是Ognl?

在日常项目开发中,经常遇到与其他数据交互就需要进行数据传输处理,那么当对方系统返回的数据报文有多层复杂的json数据时候,如何简单快捷的获取指定节点的数据呢,答案是可以使用Ognl来解决。 1.什么是ognl? OGNL全称…