《文件操作》
一 . 文本文件和二进制文件
根据数据的组织形式,数据文件被分为了二进制文件和文本文件
数据在内存中是以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件。
如果要求在外存上以ASCII 码的形式存储,则需要再存储前转换,以ASCII码的形式存储的文件就是文本文件
简单来说二进制文件就是我们看不懂的文件,而文本文件是直接可以看懂的文件
⼀个数据在文件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符⼀个字节),
以⼆进制形式输出,则在磁盘上只占4个字节。

代码示例;


可以看到以二进制方式打开的时候我们是看不懂里面的内容的。
二. 文件的打开和关闭
1. 流和标准流
(1)流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对文件、画面、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。
(2) 标准流
那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语言程序在启动的时候,默认打开了3个流:
• stdin–标准输⼊流,在⼤多数的环境中从键盘输入,scanf函数就是从标准输⼊流中读取数据。
• stdout–标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。
• stderr—标准错误流,大多数环境中输出到显示器界面。
这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr三个流的类型是: FILE * ,通常称为文件指针。
C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。
2. 文件指针

对于文件的操作我们都是通过文件指针来实现的。
(1) 文件指针的形式

3. 文件的打开和关闭
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建立了指针和文件的关系。
ANSIC规定使用 fopen 函数来打开文件, fclose 来关闭文件。

其中的mode表示打开方式

代码示例:
(1)以读的方式打开

因为这里我们的源文件底下并没有创建这个文件所以这里显示打开失败。
当我们创建好之后再打开就没问题了


(2)以写的方式打开

在以写的方式打开之前我们把之前的文件删除了,但是这里还是成功打开了

可以看到这里还把要写的内容写到了文件里面。
这是因为以写的方式和以读的方式打开文件的区别;
- 当你以读的方式打开文件时,如果没有这个文件就会打开失败
- 当你以写的方式打开文件时,即使没有这个文件,它也会自己创建一个文件然后打开
- 如果一旦打开失败的话就会返回空指针(NULL)
(3)按照路径打开文件


这里要注意一个细节:

三. 文件的顺序读写

1. fgetc和fputc函数
(1) fgetc函数介绍

可以看到该函数的返回值为int类型的,所以在读取到内容时就需要一个int类型的变量来接收
首先我们创建一个文件并往里面放一些内容


为了得到文件中的所有内容,所以这里我们利用了一个while循环,因为fgetc的停止条件是遇到错误,所以这里循环的条件就是fgetc得到的返回值!= EOF,这样就读取到了所有的字符
(2) fputc 函数介绍

通过该函数的介绍,我们可以发现这个函数的返回值的类型也为int类型,这就和fgetc对应上了。

stdin -- 标准输入
stdout -- 标准输出
2. fgetcs 和fputs函数介绍
(1)fputs函数介绍

通过该函数的介绍,我们可以看到这个函数的返回值为int类型,包含两个参数,第一个就是字符串的地址,一个是流的地址,也就是文件指针。


这里需要注意的是,如果在写入两个字符串时,如果不自己加上换行符的话,第二个字符串就会追加在第一个字符串后面
并且如果第二次打开相同的文件再写入的话,它是会删除掉原文件中的内容然后再重新写入的
(2)fgets函数介绍

通过这个函数的介绍可以看到这个函数的返回值的类型为char*,包含三个参数,第一个参数就是char*的一个指针,这个参数代表着我们把读取到的内容存放到的那个地址,第二个参数是int类型的,代表着读取的个数,第三个参数就代表着从哪读取,也就是文件指针。

这里要注意的是虽然这里我们是读取5个,但其实第五个就是\0这也算读取结束的一个标志吧
并且这里需要注意的是在读取的时候一次只能读取一行
如果要读取两行内容就需要读取两次
如果不信的话可以通过调试来看一下:

可以看到第五个读取的确实就是\0
3. fscnaf 和 fprintf 函数
(1) fprintf 函数介绍

通过该函数的介绍,其实不难发现这个函数相对较于printf函数就差了一个文件指针
会写printf函数就会写这个,就把它当做printf来写,最后再加上一个文件指针就行


(2) fscanf 函数介绍

通过该函数的介绍,可以发现这个函数和scanf函数也是只差了一个参数,也就是文件指针。
既然我们会写scanf函数,那么我们也就会写这个函数了;

4. fread 和fwrite函数
(1)fwrite 函数介绍

通过该函数的介绍,我们发现这个函数返回值为一个正整数,包含四个参数,第一个参数就是一个void*的指针,代表了要写入的数据的原地址,第二个参数代表了每个数据的大小,第三个参数就是数据的个数,第四个参数就是文件指针

可以看到这个时候已经以二进制的形式写入了,但是我们是看不懂的。
并且需要注意的是因为是二进制的读和写文件,所以这里在打开文件的时候是wb
(2)fread 函数介绍

通过对该函数的介绍,我们可以看到这个函数和fwrite函数的返回值和参数是一样的,只是一点不同的是第一个参数就成了读取到的数据存放位置的地址了

5. scanf、printf 函数和 fscanf 、fprintf 函数的对比
** 前者是针对标准输入和输出的格式化输入和输出函数**
** 后者是针对所有输入流和输出流的格式化的输入和输出函数**
6. sscanf 和sprintf函数
(1)sprintf函数介绍

通过该函数的介绍,可以看到该函数的返回值为int类型,包含第一个参数是一个char*的指针,也就是输出的数据存放的地址,后面的写法就和printf函数的写发一样了
(2)sscanf函数介绍

通过该函数的介绍,我们发现这个函数除了第一个参数和scanf函数不一样,其他的都一样,这里的第一个参数就是sprintf转化为的字符串的地址

可以看到sprintf把一些格式化的数据整合成了一个字符串的形式,而sscanf将整合好的字符串分解成了格式化的数据
四. 文件的随机读写
1. fseek定位文件指针
(1)介绍

通过该函数的介绍,我们可以看到该函数的返回值类型为int,包含三个参数,第一个参数就是文件指针,第二个参数就是文件指针偏移的长度,第三个参数就是偏移的参考点
参考点:

起始位置 、当前位置、末尾位置
(2)举例

这里需要注意的一个点就是每读取完一个数据之后,文件指针就会往后走一个单位长度,这是容易忽略的一个点,其他的没啥好说的
2. ftell函数
(1)介绍

通过该函数的介绍,我们可以知道该函数可以返回文件指针相对于起始位置的偏移量,这个和之前在学内存对齐时的求各成员相对于起始位置时用到的offsetof很像
(2) 例子

3. rewind函数
(1)介绍

通过该函数的介绍,我们可以看到该函数可以让文件指针回到起始位置
(2)例子

五. 文件结束的判定

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

这里可以得出⼀个结论:
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题。
完结撒花❀❀❀

相关文章:
《文件操作》
一 . 文本文件和二进制文件 根据数据的组织形式,数据文件被分为了二进制文件和文本文件 数据在内存中是以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件。 如果要求在外存上以ASCII 码的形式存储,则需要再存…...
python特殊字符序列
字符 描述 \A 只匹配字符串的开始 \b 匹配一个单词边界 \B 匹配一个单词的非边界 \d 匹配任意十进制数字字符,等价于r[0-9] \D 匹配任意非十进制数字字符,等价于r[^0-9]’ \s 匹配任意空格字符(空格符、tab制表符、换…...
卷积神经网络(CNN)中的批量归一化层(Batch Normalization Layer)
批量归一化层(BatchNorm层),或简称为批量归一化(Batch Normalization),是深度学习中常用的一种技术,旨在加速神经网络的训练并提高收敛速度。 一、基本思想 为了让数据在训练过程中保持同一分布…...
LLaMA-Mesh: Unifying 3D Mesh Generation with Language Models 论文解读
目录 一、概述 二、相关工作 1、LLMs到多模态 2、3D对象生成 3、自回归的Mesh生成 三、LLaMA-Mesh 1、3D表示 2、预训练模型 3、有监督的微调数据集 4、数据集演示 四、实验 1、生成的多样性 2、不同模型text-to-Mesh的比较 3、通用语境的评估 一、概述 该论文首…...
【ESP32CAM+Android+C#上位机】ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输
前言: 本项目实现ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输。本项目包含有ESP32源码(arduino)、Android手机APP源码以及C#上位机源码,本文对其工程项目的配置使用进行讲解。实战开发,亲测无误。 AP模式,就是ESP32发出一个WIFI/热点提供给电…...
ESP-KeyBoard:基于 ESP32-S3 的三模客制化机械键盘
概述 在这个充满挑战与机遇的数字化时代,键盘已经成为我们日常学习、工作、娱乐生活必不可少的设备。而在众多键盘中,机械键盘,以其独特的触感、清脆的敲击音和经久耐用的特性,已经成为众多游戏玩家和电子工程师的首选。本文将为…...
28.UE5游戏框架,事件分发器,蓝图接口
3-3 虚幻游戏框架拆解,游戏规则基础_哔哩哔哩_bilibili 目录 1.游戏架构 2.事件分发器 2.1UI控件中的事件分发器 2.2Actor蓝图中的事件分发器 2.2.1动态决定Actor的分发事件 2.2.2父类中定义事件分发器,子类实现事件分发器 2.3组件蓝图中实现事件…...
Puppeteer 和 Cheerio 在 Node.js 中的应用
Puppeteer 和 Cheerio 在 Node.js 中的应用 引言 在现代 Web 开发中,自动化测试、数据抓取和页面分析是常见的需求。Node.js 提供了丰富的工具和库来满足这些需求。本文将介绍两个在 Node.js 中常用的库:Puppeteer 和 Cheerio,它们分别用于…...
Unity2D 关于N方向俯视角 中 角色移动朝向的问题
通常对俯视角2d游戏的角色移动我们使用简单2d混合树的方式,但是其不移动时的朝向该如何定义? 十分简单:移动和不移动之间形成逻辑自锁 详细说明思路就是再创建一个简单2d混合树 定义其N方向的idle 并用lastDirc二维向量保存玩家输入,当玩家输…...
pytorch 和tensorflow loss.item()` 只能用于只有一个元素的张量. 防止显存爆炸
loss.item() 是 PyTorch 中的一个方法,它用于从一个只包含单个元素的张量(tensor)中提取出该元素的值,并将其转换为一个 Python 标量(即 int 或 float 类型)。这个方法在训练神经网络时经常用到,…...
链表刷题|判断回文结构
题目来自于牛客网,本文章仅记录学习过程的做题理解,便于梳理思路和复习 我做题喜欢先把时间复杂度和空间复杂度放一边,先得有大概的解决方案,最后如果时间或者空间超了再去优化即可。 思路一:要判断是否为回文结构则…...
海盗王集成网关和商城服务端功能golang版
之前用golang把海盗王的商城服务端和网关服务端都重写了一次。 后来在同时开启网关和商城服务时,发现窗口数量有点多,有时要找到商城窗口比较麻烦。 既然2个都是用golang govcl写的,是不是可以集成到一起,方便使用呢?…...
SCI 中科院分区中位于4区,JCR分区位于Q2 是什么水平?
环境: ACM Transactions on Interactive Intelligent Systems 《Acm Transactions On Interactive Intelligent Systems》(《交互式智能系统上的 Acm 事务》)是一本由ASSOC COMPUTING MACHINERY (ACM)出版的Computer Interaction-Computer Science-Human学术刊物&…...
微知-Mellanox网卡的另外一种升级方式mlxup?(mlxup -d xxx -i xxx.bin)
背景 一般升级Mellanox网卡使用flint,还有另外一种叫做mlxup。 NVIDIA 提供了两种固件工具来更新和查询适配器固件: MLXUP - 固件更新和查询实用程序。该实用程序允许扫描服务器计算机以查找可用的 NVIDIA 适配器,并指示每个适配器是否需要…...
《Shader入门精要》透明效果
代码以及实例图可以看github :zaizai77/Shader-Learn: 实现一些书里讲到的shader 在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,当一个物体被渲染到屏幕上时&…...
Linux之SELinux与防火墙
一、SELinux的说明 开发背景与目的: SELinux由美国国家安全局(NSA)开发,旨在避免资源的误用。传统的Linux基于自主访问控制(DAC),通过判断进程所有者/用户组与文件权限来控制访问,对…...
深度学习使用LSTM实现时间序列预测
大家好,LSTM是一种特殊的循环神经网络(RNN)架构,它被设计用来解决传统RNN在处理长序列数据时的梯度消失和梯度爆炸问题,特别是在时间序列预测、自然语言处理和语音识别等领域中表现出色。LSTM的核心在于其独特的门控机…...
Vue第一篇:组件模板总结
前言 本文希望读者有一定的Vue开发经验,样例采用vue中的单文件组件,也是我的个人笔记,欢迎一起进步 必须有根元素 这是一个最简单的vue单文件组件,<template></template>被称为模板,模板中必须有一个根元素…...
时钟使能、
时钟使能 如果正确使用,时钟使能能够显著地降低系统功耗,同时对面积或性能的影响极小。但是如果不正确地使用时钟使能, 可能会造成下列后果: • 面积增大 • 密度减小 • 功耗上升 • 性能下降 在许多使用大量控制集的…...
1. Autogen官网教程 (Introduction to AutoGen)
why autogen The whole is greater than the sum of its parts.(整体的功能或价值往往超过单独部分简单相加的总和。) -Aristotle autogen 例子 1. 导入必要的库 首先,导入os库和autogen库中的ConversableAgent类。 import os from autogen import Conversable…...
【无功优化】基于改进教与学算法的配电网无功优化【IEEE33节点】附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 dz…...
DeepSeek监控告警设置实战指南(告警失效率下降92%的7个关键开关)
更多请点击: https://kaifayun.com 第一章:DeepSeek监控告警设置的核心价值与落地挑战 在大模型推理服务规模化部署的背景下,DeepSeek系列模型(如DeepSeek-V2、DeepSeek-Coder)对资源稳定性、延迟敏感性及异常响应时效…...
AI视频生成“假熟练”陷阱(83%用户未察觉):3个隐藏技能断层导致输出质量长期停滞
更多请点击: https://kaifayun.com 第一章:AI视频生成工具学习曲线分析 AI视频生成工具的学习曲线呈现出显著的非线性特征:初学者可在数小时内完成基础视频合成,但要稳定产出符合商业标准的高质量内容,通常需跨越模型…...
如何永久解锁Cursor Pro功能:面向开发者的完整解决方案
如何永久解锁Cursor Pro功能:面向开发者的完整解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tr…...
【Google官方未公开】Gemini免费层底层计费逻辑揭秘:按token粒度精算,92%用户多花了37%配额
更多请点击: https://codechina.net 第一章:Gemini免费额度的本质与边界认知 Gemini 的免费额度并非无条件的“无限试用”,而是由 Google Cloud 的配额管理系统(Quota System)严格管控的服务配额,其本质是…...
百度网盘macOS客户端逆向工程深度解析:Method Swizzling技术实现与应用
百度网盘macOS客户端逆向工程深度解析:Method Swizzling技术实现与应用 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 百度网盘SVIP破解插…...
终极FFXIV模组管理器:TexTools完全使用指南与实战教程
终极FFXIV模组管理器:TexTools完全使用指南与实战教程 【免费下载链接】FFXIV_TexTools_UI 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_TexTools_UI 你是否厌倦了在《最终幻想14》中与其他玩家穿着相同的装备?是否梦想着为你的光之战士…...
GNSS欺骗干扰检测算法与实验验证方法【附仿真】
✨ 长期致力于GNSS欺骗干扰检测、信号检测、伪距差分、捷联惯性导航、IMU信号生成、四元数、对偶四元数、惯性辅助、单星紧组合、欺骗干扰场景模拟研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,…...
终极免费指南:如何用Whisky在Mac上运行Windows游戏与应用
终极免费指南:如何用Whisky在Mac上运行Windows游戏与应用 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 还在为Mac无法畅玩Windows游戏、运行专业软件而烦恼吗ÿ…...
Python潮汐计算新境界:pyTMD如何解决海洋工程中的三大核心挑战
Python潮汐计算新境界:pyTMD如何解决海洋工程中的三大核心挑战 【免费下载链接】pyTMD Python-based tidal prediction software 项目地址: https://gitcode.com/gh_mirrors/py/pyTMD 在海洋工程、港口建设和海洋科学研究中,精确的潮汐预测是确保…...
