C语言-文件操作

🌈很高兴可以来阅读我的博客!
🌟我热衷于分享🖊学习经验,🏫多彩生活,精彩足球赛事⚽
🔗我的CSDN: Kevin ’ s blog
📂专栏收录:C预言
1. 文件的作用
我们通常通过文件将我们的资料或者代码给保存到电脑的硬盘中。如果不使用程序的话我们的所运行的程序在推出后就会丢失数据,这是因为我们运行的时候他使用的是电脑的内存,在退出程序后内存会被回收,数据也就随之而去了,再次运行程序就找不到之前的数据了。
所以在这种情况下,文件的作用就体现出来了。可以通过创建一个文件来保存之前的数据,这样的话在下次运行程序的时候就可以使用之前的数据了,将数据做到了持久化的保存。
2. 二进制文件和文本文件
2.1 数据⽂件
在C语言文件操作中主要学习的是对于数据文件的操作
数据文件不是用来保存程序的,而是用来保存程序运行后产生的数据
2.2 文本文件
文本文件是以人类可读的字符形式存储数据的文件。这意味着它们通常包含文本内容,比如字母、数字、标点符号等。文本文件可以被文本编辑器打开并直接阅读,因为它们使用了人类可识别的字符编码(比如ASCII或Unicode)来表示数据。
在C语言中,使用标准的文件I/O函数(比如fprintf、fscanf、fgets、fputs等)来处理文本文件是很方便的。这些函数可以直接读取和写入文本文件中的文本数据,并且适合于处理文本内容。
2.3 二进制文件
二进制文件以字节序列的形式存储数据,而不是以人类可读的字符形式。这意味着它们可以存储任何类型的数据,包括数字、图像、音频、视频等。由于二进制文件不以人类可读的形式存储数据,它们无法直接用文本编辑器打开和阅读。
在C语言中,处理二进制文件需要使用fread和fwrite等函数,这些函数可以直接读取和写入二进制数据。因为二进制文件不关心数据的具体内容,所以它们非常适合用于存储和传输各种类型的数据。
2.4 区别
- 存储方式:文本文件以字符形式存储数据,而二进制文件以字节序列的形式存储数据。
- 可读性:文本文件可以被文本编辑器直接打开和阅读,而二进制文件不具备可读性。
- 用途:文本文件适合存储文本内容,而二进制文件适合存储各种类型的数据。
2.5 数据在文件中的存储方式
字符型的数据以ASCII形式进行存储
数值型数据既可以使用ASCII形式进行存储,也可以使用二进制形式存储
操作示例:
操作环境:VS2022
①创建txt文件

首先在工程文件夹中创建一个txt文件test。
② 运行代码并在VS中打开二进制文件
#include <stdio.h>
int main()
{int a = 100;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中fclose(pf);pf = NULL;return 0;
}
当运行后打开txt文件后发现了如下图所示的显示:

出现此种情况的原因是因为没有打开二进制文本模式,所以看到的是我们看不懂的乱码
打开二进制文件方法
通过以下操作即可实现打开二进制文件

此时再打开txt文件查看:
为什么是这个结果呢?
这时候就涉及到了上文所讲述的数据在文件中的存储方式,将内容简化为文字就是下图所示(以10000为例):

当放入10000时实际上放入的是10011100010000这个二进制序列,在二进制文件中显示的是十六进制的数字序列,所以存进去的时候看的是十六进制大小2710,由于是VS是小段存储,所以实际存储进去的序列的就是1027(拿出来的时候还是2710)。

以上就是关于运行代码在VS中的二进制文件中的相关知识。
3. 文件的打开和关闭
3.1 流和标准流
3.1.1 流
流的概念
流提供了一个统一的接口,使得程序可以以统一的方式处理来自不同数据源和输出到不同目标的数据。通过使用标准库中提供的函数,比如fopen、fclose、fread、fwrite等,可以操作流并对数据进行读写操作。
在C语言中,流是以FILE结构表示的,每个流都对应着一个FILE类型的指针。通过这个指针,程序可以访问流的属性和进行读写操作。标准输入流、标准输出流和标准错误流在程序启动时就已经自动打开,无需额外操作。
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
3.1.2 标准流
在C语言中,标准库提供了一组预定义的流,称为标准流(standard streams),它们包括标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)。
- 标准输入流(stdin):标准输入流用于从程序外部读取数据,通常与键盘输入相关联。当你使用
scanf等函数读取用户输入时,实际上是从标准输入流中读取数据。- 标准输出流(stdout):标准输出流用于向程序外部输出数据,通常与屏幕输出相关联。当你使用
printf等函数输出信息时,实际上是往标准输出流中写入数据。- 标准错误流(stderr):标准错误流用于输出程序的错误信息,通常与屏幕输出相关联。当程序发生错误时,可以使用
fprintf(stderr, ...)函数将错误信息输出到标准错误流。
3.2文件指针
每个被使用的文件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如问件的名字,文件状态及文件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE。
stdio.h 头⽂件中有以下的⽂件类型申明:
struct _iobuf
{char* _ptr;int _cnt;char* _base;int _flag;int _file;int _charbuf;int _bufsiz;char* _tmpfname;
};typedef struct _iobuf FILE;
当我们打开一个文件的时候系统会自己创建该结构,⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量。
FILE*类型的指针变量的创建:
FILE* pf;
文件指针变量实际上并不直接指向文件本身,而是指向文件在内存中的相关信息。通过文件指针变量,程序可以间接地找到与其关联的文件,即通过文件指针变量所指向的信息来操作对应的文件。
当我们使用fopen函数打开一个文件时,该函数会返回一个指向FILE类型的指针,这个指针指向了文件在内存中的相关信息,比如文件的状态、位置等。通过这个文件指针,程序可以对文件进行读取、写入等操作,实现了对文件的间接访问和控制。
因此,虽然文件指针变量本身并不直接指向文件的实际内容,但通过它可以间接地找到与其关联的文件,并对文件进行操作。这种间接性的设计使得程序能够更加灵活地处理文件,同时也增强了程序与文件之间的抽象层级。
3.3 文件的打开和关闭
文件在读写时需要先打开文件,使用后关闭文件。
- fopen 函数来打开⽂件
- fclose 来关闭⽂件
//打开⽂件
FILE* fopen(const char* filename, const char* mode);//关闭⽂件
int fclose(FILE* stream);
mode表示打开文件的方式,有以下方式:
代码示例:
/* fopen fclose example */
#include <stdio.h>
int main()
{FILE* pFile;//打开⽂件pFile = fopen("myfile.txt", "w");//⽂件操作if (pFile != NULL){fputs("fopen example", pFile);//关闭⽂件fclose(pFile);}return 0;
}
4.文件读写函数
4.1 顺序读写
| fgetc | 字符输⼊函数 | 所有输⼊流 |
|---|---|---|
| fputc | 字符输出函数 | 所有输出流 |
| fgets | ⽂本⾏输⼊函数 | 所有输⼊流 |
| fputs | ⽂本⾏输出函数 | 所有输出流 |
| fscanf | 格式化输⼊函数 | 所有输⼊流 |
| fprintf | 格式化输出函数 | 所有输出流 |
| fread | ⼆进制输⼊ | ⽂件 |
| fwrite | ⼆进制输出 | ⽂件 |
4.2 随机读写
| fseek | int fseek ( FILE * stream, long int offset, int origin ); |
|---|---|
| ftell | long int ftell ( FILE * stream ); |
| rewind | void rewind ( FILE * stream ); |
详见课件

相关文章:
C语言-文件操作
🌈很高兴可以来阅读我的博客!🌟我热衷于分享🖊学习经验,🏫多彩生活,精彩足球赛事⚽🔗我的CSDN: Kevin ’ s blog📂专栏收录:C预言 1. 文件的作用 …...
ADB 操作命令详解及用法大全
ADB 简介 ADB,全称 Android Debug Bridge,是 Google 提供的一款用于 Android 平台设备(包括真机和模拟器)调试、交互和管理的命令行工具。通过 ADB,开发者可以在电脑上对连接的 Android 设备执行一系列高级操作&#…...
指针数组。
指针数组 int c[5]{1,2,3,4,5};int *pc;printf("p:%d",p);return 0;输出:p:-756683712 说明p是地址值,*p就是取这个地址上的元素的值。所以printf(“*p:%d”,*p); 打印出来的是 *p:1 *pc,c是c[5]数组的首地址元素。 #include <iostream>…...
GitHub开源项目权限管理-使用账号和个人令牌访问
1.打开后台账号设置 2.找到左下角的Developer settings 3.找到Personal access tokens 的 Tokens(classic) 4.选择创建新证书 5.填写证书信息 6.点击生成证书,复制证书并且保存起来(血泪教训,证书只会在创建时显示一次,以后就再也…...
DevSecOps平台架构系列-亚马逊云AWS DevSecOps平台架构
目录 一、概述 二、AWS DevSecOps实施原则 2.1 尽早采用安全测试,加速问题反馈 2.2 优先考虑预防性安全控制 2.3 部署检测性安全控制时,确保有与之互补的响应性安全控制 2.4 安全自动化 2.5 总结 三、AWS DevSecOps关键组件 3.1 关键组件 3.2 关…...
KaTex 常用公式编辑
原文:https://blog.iyatt.com/?p7854 注:语法上和 Latex 差不多一样,我是因为 WordPress 上使用 WP Githuber MD 插件,才用的 KaTex(插件里面的 LaTex 模块有 bug,无法渲染) 希腊字母 大写代…...
域攻防渗透之委派攻击
出身寒微,不是耻辱,能屈能伸,方为丈夫。 约束性委派的利用 原理 非约束性委派被委派的机器会直接得到发布委派的用户的TGT,是十分不安全的,因此微软推出了约束性委派,还扩充kerberos协议,添加…...
优雅的使用ChromeDriver
在网页自动化测试中,我们经常需要控制浏览器执行各种操作。对于Python开发者来说,可以使用 Selenium 库来实现这一目的。Selenium需要与浏览器的驱动程序(Driver)配合使用,本文将介绍如何在Windows 11系统下载ChromeDriver并正确保存。 第一步:确定Chrome浏览器版本号 打开Ch…...
react native hooks 页面出现重绘问题,如何解决
在React Native应用中,使用Hooks导致页面出现频繁重绘或性能问题时,可以尝试以下策略来优化和解决问题: 减少不必要的状态更新: 使用 React.memo 高阶组件包裹那些不需要每次父组件状态改变时都重新渲染的子组件。它通过浅比较pro…...
kafka安装并测试
一. Linux下ZooKeeper的安装及使用 1、创建工作目录,下载安装包 #创建安装目录 mkdir -p /opt/zookeeper #移动到目录 cd /opt/zookeepe #下载zookeeper安装包 wget https://mirrors.aliyun.com/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz #解…...
flutter路由跳转
Navigator.of(context).push(); //路由跳转(模块方式) Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {return const Page() ;//Page()指页面}, )) Navigator.pushNamed(context, "/") //路由跳转(路由方式) Navigator.pop(cont…...
微服务项目小结1
01.微服务的概念 单体、分布式、集群 (面试用到)微服务把之前的大的应用,按照业务功能拆分成若干个小的模块,每个模块都是独立的开发,测试,上线,维护缺点: 开发成本高,众多服务出错的处理(容错),分布式事务…...
【小熊猫 ide】更新支持mingw 支持c++20
没有format 头文件 GCC版本对C++的支持情况即使我使用11,也没有format 头文件小熊猫 ide https://wwe.lanzoui.com/b01os0mwd最新11可以自己更新https://royqh1979.gitee.io/redpandacpp/docsy/docs/gcc13 才支持format [7GCC 13 has added support for std::format.](https:/…...
ESD保护二极管ESD9B3.3ST5G 以更小的空间实现强大的保护 车规级TVS二极管更给力
什么是汽车级TVS二极管? TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护,防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中,由于车辆启…...
SAP BTP云上一个JVM与DB Connection纠缠的案例
前言 最近在CF (Cloud Foundry) 云平台上遇到一个比较经典的案例。因为牵扯到JVM (app进程)与数据库连接两大块,稍有不慎,很容易引起不快。 在云环境下,有时候相互扯皮的事蛮多。如果是DB的问题,就会找DB…...
Linux进程的基本概念
冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 截至目前,我们所认识的计算机,都是有一个个的硬件组件组成 输入单元:包括键盘 , 鼠标…...
设计模式深度解析:AI如何影响装饰器模式与组合模式的选择与应用
🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 AI如何影响装饰器模式与组合模式的选择与应用 在今天这个快速发展的技术时代&#…...
JAVA面试大全之微服务篇
目录 1、Spring Cloud 1.1、什么是微服务?谈谈你对微服务的理解? 1.2、什么是Spring Cloud? 1.3、springcloud中的组件有那些? 1.4、具体说说SpringCloud主要项目...
WiFiSpoof for Mac wifi地址修改工具
WiFiSpoof for Mac,一款专为Mac用户打造的网络隐私守护神器,让您在畅游互联网的同时,轻松保护个人信息安全。 软件下载:WiFiSpoof for Mac下载 在这个信息爆炸的时代,网络安全问题日益凸显。WiFiSpoof通过伪装MAC地址&…...
14 - grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)
@[TOC](grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)) 空域法的基本思想是假设地面某区域的质量变化是由一系列位置已知、质量未知的质量块(小范围区域)引起的,那么将GRACE反演的结果归算到n个质量块上的过程就是泄露信号恢复的过程。个人理解是这样的:假定已知研…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

