C语言-文件操作


🌈很高兴可以来阅读我的博客!
🌟我热衷于分享🖊学习经验,🏫多彩生活,精彩足球赛事⚽
🔗我的CSDN: Kevin ’ s blog
📂专栏收录:C预言


1. 文件的作用

我们通常通过文件将我们的资料或者代码给保存到电脑的硬盘中。如果不使用程序的话我们的所运行的程序在推出后就会丢失数据,这是因为我们运行的时候他使用的是电脑的内存,在退出程序后内存会被回收,数据也就随之而去了,再次运行程序就找不到之前的数据了。

所以在这种情况下,文件的作用就体现出来了。可以通过创建一个文件来保存之前的数据,这样的话在下次运行程序的时候就可以使用之前的数据了,将数据做到了持久化的保存

2. 二进制文件和文本文件

2.1 数据⽂件

在C语言文件操作中主要学习的是对于数据文件的操作

数据文件不是用来保存程序的,而是用来保存程序运行后产生的数据

2.2 文本文件

文本文件是以人类可读的字符形式存储数据的文件。这意味着它们通常包含文本内容,比如字母、数字、标点符号等。文本文件可以被文本编辑器打开并直接阅读,因为它们使用了人类可识别的字符编码(比如ASCII或Unicode)来表示数据。

在C语言中,使用标准的文件I/O函数(比如fprintffscanffgetsfputs等)来处理文本文件是很方便的。这些函数可以直接读取和写入文本文件中的文本数据,并且适合于处理文本内容。

2.3 二进制文件

二进制文件以字节序列的形式存储数据,而不是以人类可读的字符形式。这意味着它们可以存储任何类型的数据,包括数字、图像、音频、视频等。由于二进制文件不以人类可读的形式存储数据,它们无法直接用文本编辑器打开和阅读。

在C语言中,处理二进制文件需要使用freadfwrite等函数,这些函数可以直接读取和写入二进制数据。因为二进制文件不关心数据的具体内容,所以它们非常适合用于存储和传输各种类型的数据。

2.4 区别

  1. 存储方式:文本文件以字符形式存储数据,而二进制文件以字节序列的形式存储数据。
  2. 可读性:文本文件可以被文本编辑器直接打开和阅读,而二进制文件不具备可读性。
  3. 用途:文本文件适合存储文本内容,而二进制文件适合存储各种类型的数据。

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 流

流的概念

流提供了一个统一的接口,使得程序可以以统一的方式处理来自不同数据源和输出到不同目标的数据。通过使用标准库中提供的函数,比如fopenfclosefreadfwrite等,可以操作流并对数据进行读写操作。

在C语言中,流是以FILE结构表示的,每个流都对应着一个FILE类型的指针。通过这个指针,程序可以访问流的属性和进行读写操作。标准输入流、标准输出流和标准错误流在程序启动时就已经自动打开,无需额外操作。

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

3.1.2 标准流

在C语言中,标准库提供了一组预定义的流,称为标准流(standard streams),它们包括标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)。

  1. 标准输入流(stdin):标准输入流用于从程序外部读取数据,通常与键盘输入相关联。当你使用scanf等函数读取用户输入时,实际上是从标准输入流中读取数据。
  2. 标准输出流(stdout):标准输出流用于向程序外部输出数据,通常与屏幕输出相关联。当你使用printf等函数输出信息时,实际上是往标准输出流中写入数据。
  3. 标准错误流(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 随机读写

fseekint fseek ( FILE * stream, long int offset, int origin );
ftelllong int ftell ( FILE * stream );
rewindvoid rewind ( FILE * stream );

详见课件


Black and White Gamer (Hacks or Reviews) Gaming YouTube Video Intro.png

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

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

相关文章

【核弹级软安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件

Red Hat 发布了一份“紧急安全警报”&#xff0c;警告称两款流行的数据压缩库XZ Utils&#xff08;先前称为LZMA Utils&#xff09;的两个版本已被植入恶意代码后门&#xff0c;这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094&#xff0c;其CVS…

基于SSM远程同步课堂系统

基于SSM远程同步课堂系统的设计与实现 摘要 在这样一个网络数据大爆炸的时代&#xff0c;人们获取知识、获取信息的通道非常的多元化&#xff0c;通过网络来实现数据信息的获取成为了现在非常常见的一种方式&#xff0c;而通过网络进行教学&#xff0c;在网络上进行远程的课堂…

vue3 视频播放功能整体复盘梳理

回顾工作中对视频的处理&#xff0c;让工作中处理的问题的经验固化成成果&#xff0c;不仅仅是完成任务&#xff0c;还能解答任务的知识点。 遇到的问题 1、如何隐藏下载按钮&#xff1f; video 标签中的controlslist属性是可以用来控制播放器上空间的显示&#xff0c;在原来默…

视觉里程计之对极几何

视觉里程计之对极几何 前言 上一个章节介绍了视觉里程计关于特征点的一些内容&#xff0c;相信大家对视觉里程计关于特征的描述已经有了一定的认识。本章节给大家介绍视觉里程计另外一个概念&#xff0c;对极几何。 对极几何 对极几何是立体视觉中的几何关系&#xff0c;描…

LeetCode刷题【链表,图论,回溯】

目录 链表138. 随机链表的复制148. 排序链表146. LRU 缓存 图论200. 岛屿数量994. 腐烂的橘子207. 课程表 回溯 链表 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节…

搜索与图论——Floyd算法求最短路

floyd算法用来求多源汇最短路 用邻接矩阵来存所有的边 时间复杂度O(n^3) #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 20010,INF 1e9;int n,m,k; int g[N][N];void floyd(){for(int k 1;k < n;k ){f…

C++从入门到精通——引用()

C的引用 前言一、C引用概念二、引用特性交换指针引用 三、常引用保证值不变权限的方法权限的放大权限的缩小权限的平移类型转换临时变量 四、引用的使用场景1. 做参数2. 做返回值 五、传值、传引用效率比较值和引用的作为返回值类型的性能比较 六、引用和指针的区别引用和指针的…

AI算法中的关键先生 - 反向转播与戴维莱姆哈特

0. 引言 机器学习的自动推导过程中有一个关键步骤&#xff0c;就是自动求解过程的参数反向传播过程&#xff0c;这个工作据说是这个人做的&#xff1a; Remembering David E. Rumelhart (1942-2011) – Association for Psychological Science – APSAPS Fellow and Charter …

CDR2024软件免费版 CDR绘制矢量图形插画 平面设计CDR教程 cdr2024注册机 cdr2024安装包百度云 cdr快捷键

CDR2024软件免费版是由加拿大Corel公司研发的平面设计类软件。CDR2024软件免费版应用的行业非常广泛&#xff0c;影视动画、网页设等行业都可以应用此软件。CDR2024软件免费版为专业工作者提供了更加精细的操作功能&#xff0c;用户可以更加精确的对图片进行修改&#xff0c;降…

【MySQL】DQL-查询语句全解 [ 基础/条件/分组/排序/分页查询 ](附带代码演示&案例练习)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

解决一个有意思的抛硬币问题,计算连续两次正面所需次数的数学期望

文章目录 一、问题与分析二、基本的数学推导三、代码示例 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、问题与分析 问题&#xff1a;对于质地均匀的硬币&#xff0c;连续两次得到正面所需的次数数学期望是多少&#xff1f; 关键词&#xff1a;…

10天学会kotlin DAY6 继承、类、重载

kotlin 继承与重载 前言 1、open 关键字 2、类型转换 3、Any 超类 4、对象声明 5、对象表达式 6、伴生对象 7、嵌套类和内部类 8、数据类 9、copy 函数 10、运算符重载 11、枚举类定义函数 12、代数数据类型 13、密封类 14、数据类的小结 总结 前言 使用纯代码…

「MySQL」索引事务

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;数据库 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 索引&事务 &#x1f349;索引&#x1f34c;特点&#x1f34c;通过 SQL 操作索引&#x1f34c;底层数据结构 &#x1f349;事务&…

Nginx的反向代理

Nginx的反向代理 location ^~ /aaa {proxy_pass http://192.168.15.78/; } 1. 跨域 2.Nginx 代理服务器缓存 3.Nginx 负载均衡 4. 动静分离 Nginx的跨域 跨源资源共享 (CORS) 是一种机制&#xff0c;它使用额外的 HTTP 标头让用户代理获得访问来自不同来域的服务器上选定资…

3.31学习总结

算法 解题思路 使用dfs,对蛋糕每层可能的高度和半径进行穷举.通过观察我们可以知道第一层的圆面积是它上面所有蛋糕层的圆面积之和,所以我们只要去求每层的侧面积就行了. 因为题目要求Ri > Ri1且Hi > Hi1,所以我们可以求出每层的最小体积和侧面积,用两个数组分别储存起来…

C语言实现猜数字游戏(有提示,限制次数版)

这次的猜数字游戏我添加了新的功能&#xff1a;为玩家添加了提示&#xff0c;以及输入数字的限制次数。 首先&#xff0c;我们的猜数字游戏需要一个菜单&#xff0c;来让玩家可以选择玩游戏还是退出游戏&#xff0c;所以我们需要开始就打印一个菜单&#xff1a; int main() {…

Mac air 个人免费版VMWare Fusion安装及配置教程

Mac air 安装免费版VMWare Fusion教程及问题解决 1、下载VMWare Fusion2、下载wins镜像文件3、开始配置4、出现的问题及解决方法4.1 如何跳过启动时的网络连接4.2 启动后&#xff0c;无法连接网络怎么办4.3 怎么实现将文件拖拽到虚拟机中 当你手上是一台Mac电脑&#xff0c;却需…

VS Code常用前端开发插件和基础配置

VS Code插件安装 VS Code提供了非常丰富的插件功能&#xff0c;根据你的需要&#xff0c;安装对应的插件可以大大提高开发效率。 完成前端开发&#xff0c;常见插件介绍&#xff1a; 1、Chinese (Simplified) Language Pack 适用于 VS Code 的中文&#xff08;简体&#xff…

【原创】基于分位数回归的卷积长短期结合注意力机制的神经网络(CNN-QRLSTM-Attention)回归预测的MATLAB实现

基于分位数回归的卷积长短期结合注意力机制的神经网络&#xff08;CNN-QRLSTM-Attention&#xff09;是一种用于时间序列数据预测的深度学习模型。该模型结合了卷积神经网络&#xff08;CNN&#xff09;、长短期记忆网络&#xff08;LSTM&#xff09;和注意力机制&#xff08;A…

C++ 数组 结构编程题

一 求100以内的所有素数 /* * 需要标记2~100 之间的数是否处理 * 用数组&#xff0c;初始为0 表示都是素数&#xff0c;如果 判断为合数则置为1过用 */ #include<stdio.h> #include<math.h> int main() {const int n 100;int isPrim[n 1] { 0 };int i, j;for (…