【C语言】文件操作(下)

news2025/1/20 17:05:12

文章目录

  • 前言
  • 1. 文件的读和写
  • 2. 文件的顺序读写
    • 2.1 顺序读写函数的介绍
      • 2.1.1 fgetc 和 fputc
      • 2.1.2 fgets 和 fputs
  • 3. 文件缓冲区
  • 4. 总结

前言

在之前文件操作(上)和文件操作(中)的文章中,我从为什么要使用文件再到文件的打开和关闭操作给大家解读了文件在内存中运行的底层原理,但是我并未介绍文件的一下详细的读写操作。那么,在本文我就给大家介绍文件的一系列读写操作

1. 文件的读和写

读文件就是从文件中读取数据到内存中,写文件就是把内存中的一些数据写入到文件中。

可能有的读者会问,这么简单的道理为什么还要拿出来单独的讲?因为在我自己学习文件初期时,常常会被读写这两个字眼弄得晕头转向。倒不是说有多难理解,关键在于弄清谁是读写的主体。

什么意思呢?就是文件可用作为读写的对象,那内存不也大致认为可以进行读写。
再详细一点就是,内存也可以作为读写的对象,然而内存的读写与文件的读写两种不同的说法,背后的逻辑确是完全相同的。

比如,我要从文件中读取信息,那就是对文件进行读操作。我要从文件中写入数据,那就是对文件中进行写操作。
再如,我要从文件中输出数据到内存,那就是对文件进行读操作。我要从内存中输入数据到文件,那就是对文件进行写操作。

但是如果我换种说法,结局可能就不一样了。
比如,我要把内存中的数据输出到文件中,而这时对于文件来说,就不是读操作,而是写操作了。所以我们不能只简单看“输入”和“输出”这两个字眼就断定是读操作还是写操作。我们还要看谁是主体。

有一副图可以这么表示(只是以文件为对象):
图解
这里我想告诉大家的就是,一定认清谁是读写的主体,因为这关系到我们之后所使用函数对应的文件打开模式。

2. 文件的顺序读写

2.1 顺序读写函数的介绍

提示:以文件为对象(功能),以内存为对象(适用于)

函数名功能适用于
fgetc字符输入函数(读)所有输入流
fputc字符输出函数(写)所有输出流
fgets文本行输入函数(读)所有输入流
fputs文本行输出函数(写)所有输出流
fscanf格式化输入函数(读)所有输入流
fprintf格式化输出函数(写)所有输出流
fread二进制输入(读)文件输入流
fwrite二进制输出(写)文件输出流

上面说的适用于所有输入流一般指适用于标准输入流其他输入流(如文件输入流);上面说的适用于所有输出流一般是指适用于标准输入流其他输入流(如文件输入流)。

那接下来我将一对一对的为大家讲解上面的函数,内容可能有点多,希望耐心阅读。

2.1.1 fgetc 和 fputc

fgetc函数的原型:
fgetc函数原型

fgetc函数的参数和返回值
需要关注的是fgetc函数的返回值,每当读到文件末尾时,函数就会返回一个EOF(end of file)。这个EOF在C编译器中被定义为-1。

fputc函数的原型:
fputc函数原型
fputc形参和返回值

  • fgetc的功能:将文件中的字符输出到程序中。
  • fputc的功能:将程序中的字符输入到文件中。

案例演示:
fgetc:
fgetc案例演示
fputc:
fputc函数的案例演示

2.1.2 fgets 和 fputs

fget函数的原型:
fgets函数原型
fgets的形参和返回值
fgets:
fgets的案例演示
fgets函数功能:将文件中的文本行数据输入到程序中。

在使用fgets函数时的一些小细节:

  • 当fgets函数读取失败时,会返回一个空指针
  • 针对fgets形参中的int num,这个形参的意思是允许拷贝的最大字节数,其中‘\0’本来就占用这个形参的位置。举个例子,比如我有一个字符串“abc”,现在我让num=3,其在文件中读取的只有2个字节的内容,因为‘\0’本身就占一个字节。(重点)

fputs函数的原型:
fputs函数原型

fputs函数形参和返回值

fputs:
fputs函数案例演示

fputs函数的功能:向文件输入文本行内容。
如果该函数执行成功,那么它将会返回一个非负数的值。

限于篇幅的原因,本次的读写函数就介绍到这里。剩余的读写函数和随机读写函数,我会在之后的文章中于大家分享,敬请期待!!!💖💖💖

3. 文件缓冲区

ANSIC标准(也就是标准C)采用“缓冲文件系统”处理的数据文件。所谓的缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到文件缓冲区,等待文件缓冲区装满数据之后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满内存缓冲区),然后再从缓冲区中逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

图片

也就是说,这个缓冲文件系统有两大主体,分别是文件缓冲区和内存缓冲区,对应着输出缓冲区和输入缓冲区。我内存中有数据输入到文件中时,要等到文件缓冲区被装满时,才会将内容写入文件中。内存缓冲区也是如此,只有等到内存缓冲区被填满时,才会将数据逐个的输入到内存中的程序数据区中。

4. 总结

至此,我就为大家讲完了文件操作的绝大部分的内容了。内容比较多,但对于我们后续学习有关于文件的操作很有帮助。

最后,觉得本系列章节写的不错的话,麻烦给偶点点赞!!!😘😘😘

学习很难,但坚持一定很酷。

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

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

相关文章

RabbitMQ高级特性 - 生产者消息确认机制

文章目录 生产者消息确认机制概述confirm 代码实现return 代码实现 生产者消息确认机制 概述 为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制. RabbitMQ 提供了两种解决方案: 通过事务机制实现.通过发送确认机制(confi…

CPU利用率100%该怎么办

1 节拍率 Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。 为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 H…

AI大模型定级体系

前言:一直以来人们对通用人工智能(AGI)的定义始终缺乏一个具体的衡量标准,而现在OpenAI已创建了一套分级系统。 AI大模型定级 OpenAI对于其大模型的定级有一个独特的分级体系,旨在描述其人工智能系统的发展阶段以及距…

网络安全埋头干活,也要抬头看路

24年的Hvv大家干的正是热火朝天,也有的干的无可奈何,确实Hvv的核心其实是在Hvv前的准备阶段,Hvv中可能更多的是盯监控。 7月份我也出了两趟差,看了一下在Hvv项目上的小伙伴,30%的时间是在处理误报,60%的时…

51 for 循环与 while 循环

Python 主要有 for 循环和 while 循环两种形式的循环结构,多个循环可以嵌套使用,并且还经常和选择结构嵌套使用来实现复杂的业务逻辑。 while 循环一般用于循环次数难以提前确定的情况,当然也可以用于循环次数确定的情况。 for 循环一般用于…

共享`pexlinux`数据文件的网络服务

实验环境准备: 1.红帽7主机 2.要全图形安装 3.配置网络为手动,配置网络可用 4.关闭vmware DHCP功能 一、kickstart自动安装脚本制作 1.安装图形化生成kickstart自动脚本安装工具 2.启动图形制作工具 3.图形配置脚本 这里使用的共享方式是http&#xff0…

SpringBoot + Vue + ElementUI 的人力资源管理系统-附项目源码与配套文档

摘 要 在如今这个人才需求量大的时代,各方企业为了永葆企业的活力与生机,在不断开 拓进取的同时,又广泛纳用人才,为企业的长久发展奠定了基础。于是,各个企业与部 门机构,都不可避免地会接触到人力资源管理…

微信小程序之behaviors

目录 概括 Demo演示 进阶演示 1. 若具有同名的属性或方法 2. 若有同名的数据 3. 若有同名的生命周期函数 应用场景 最后 属性&方法 组件中使用 代码示例: 同名字段的覆盖和组合规则 概括 一句话总结: behaviors是用于组件间代码共享的特性, 类似一…

03 RabbitMQ:HelloWorld

03 RabbitMQ:HelloWorld 1. 目标2. 实现2.1. 新建Spring Boot 项目2.1.1. 新建生产者(producer)项目2.1.2. 新建生产者(consumer)项目 2.2. 导入依赖2.3. 代码2.3.1. 发送消息(producer)2.3.2. …

TiKV Raft 快照全流程丨TiKV 源码解读(二十二)

导读 TiKV 是一个支持事务的分布式 Key-Value 数据库,目前已经是 CNCF 基金会的顶级项目。它通过 Raft 协议实现数据的高可用性和强一致性,是 TiDB 分布式数据库系统的重要组成部分。本文作为 TiKV 源码解读系列的增补,详细介绍了 TiKV 8.2.…

2024华数杯C题保姆级分析完整思路+代码+数据教学

2024华数杯C题保姆级分析完整思路代码数据教学 C题题目:老外游中国 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 1 总体分析: 题目要求本题目基于中国境内旅游景点数据,旨在通过数学建模解决外国游客在中国旅游时可能遇到的…

安装pytorch GPU方法

参考全网最详细的安装pytorch GPU方法,一次安装成功!!包括安装失败后的处理方法!-CSDN博客 整体来看,一共下面三个安装步骤: 显卡驱动(nvidia-smi)-》显卡深度学习驱动&#xff08…

三十种未授权访问漏洞复现 合集( 四 )

未授权访问漏洞介绍 未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷,导致其他用户可以直接访问,从而引发重要权限可被操作、数据库、网站目录等敏感信息泄露。---->目录遍历 目前主要存在未授权访问漏洞的有:NFS服务&a…

日志系统——整体框架

日志等级模块: 该模块描述了日志消息的各种等级debug,info,warn,error,fatal,off(off为最高等级,屏蔽一切日志消息),并提供描述日志等级的方法 日志消息模块: 该模块负责构建日志消息对象,此对象管理着一条日志中的各项…

【Python网络爬虫案例】python爬虫之爬取豆瓣电影信息

🔗 运行环境:PYTHON 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

【C语言】计算四则运算,中缀表达式转换为后缀表达式

C语言编程—中缀表达式转换为后缀表达式 思路: 中缀转后缀保存结果栈:stack,保存数据和-*/ 操作符栈:op_stack,保存-*/() 场景一:遇到数据,直接入栈stack 场景二:遇到"(&qu…

海康笔试题

1. 2. 块设备:磁盘设备驱动、SD设备驱动 字符设备:终端设备驱动 网络设备:网络设备驱动 (1)linux操作系统驱动程序分为三大类:字符设备驱动、快设备驱动和网络设备驱动 (2)字符设…

2024 年华数杯全国大学生数学建模竞赛C 题 老外游中国 完整思路 源代码 模型结果(仅供学习)

最近,“city 不 city”这一网络流行语在外国网红的推动下备受关注。随着我国过境免签政策的落实,越来越多外国游客来到中国,通过网络平台展示他们在华旅行的见闻,这不仅推动了中国旅游业的发展,更是在国际舞台上展现了…

基于X86+FPGA助力实现电力系统的智能监测与高效管理

电力监控 信迈提供基于Intel平台、Xilinx平台、Rockchip平台、NXP平台、飞腾平台的Mini-ITX主板、Micro-ATX主板、ATX主板、嵌入式准系统/工业整机等计算机硬件。产品算力强大,支持高速存储,提供丰富串口、USB、LAN、PCIe扩展接口、显示接口等I/O接口&am…

【python】数据类型之列表类型(上)

本篇文章将讲解列表类型。 列表(list),是一个有序且可变的容器,在里面可以存放多个不同类型的元素。 列表中的元素之间用逗号(英文中的逗号)相隔。 1、定义: 例如: user_list[]…