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个质量块上的过程就是泄露信号恢复的过程。个人理解是这样的:假定已知研…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
EEG-fNIRS联合成像在跨频率耦合研究中的创新应用
摘要 神经影像技术对医学科学产生了深远的影响,推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下,基于神经血管耦合现象的多模态神经影像方法,通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里,本研…...
项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...

