当前位置: 首页 > news >正文

【C语言】文件操作篇-----程序文件和数据文件,文件的打开和关闭,二进制文件和文本文件,fopen,fclose【图文详解】

欢迎来CILMY23的博客喔,本篇为【C语言】文件操作篇-----程序文件和数据文件,文件的打开和关闭,二进制文件和文本文件【图文详解】,感谢观看,支持的可以给个一键三连,点赞关注+收藏。

前言

在了解完动态内存管理,我们本期将使用一些文件指针来对外部文件进行操作

前两期博客:

动态内存管理1:

【C语言】内存操作篇---动态内存管理----malloc,realloc,calloc和free的用法【图文详解】-CSDN博客

动态内存管理2:

【C语言】动态内存管理------常见错误,以及经典笔试题分析,柔性数组【图文详解】-CSDN博客

目录

一、为什么会有文件?

二、什么是文件?

2.1程序文件

2.2数据文件 

2.3之间的区别 

三、文件名 

四、 二进制文件和文本文件 

五、文件的打开和关闭

 4.1流和标准流

4.1.1流

4.1.2标准流

4.2文件指针

4.3文件的打开和关闭

4.3.1 fopen

4.3.2 fclose 

fopen和fclose的使用 

 文件操作的表格:


一、为什么会有文件?

文件存在的主要目的是为了存储、组织和共享信息,而在计算机学习中,我们知道在内存上运行的东西,如果程序退出了,内存就会被回收,我们需要长期存储,就有了文件来进行存储,而文件是存储到硬盘上的,可以长期保存。

二、什么是文件?

文件是计算机存储数据的一种方式,它可以存储文本、图像、音频、视频等各种类型的信息。文件通常由一个或多个字符序列组成,每个字符可以是字母、数字、符号或控制字符。文件通常被保存在计算机的存储介质(例如硬盘、固态硬盘、光盘)中,并用于存储和传输数据。文件可以通过文件管理系统进行访问、编辑和管理。在计算机系统中,文件是组织和处理数据的基本单位,它们被用于存储和传输各种类型的信息。

2.1程序文件

程序文件(也称为可执行文件或代码文件)是包含计算机程序代码的文件。它们通常包含一系列指令和命令,告诉计算机如何执行特定的任务。程序文件在计算机上运行时,会被解释和执行,从而实现特定的功能。

程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows 环境后缀为.exe)等

win11下的图标:

2.2数据文件 

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。数据文件是存储数据信息的文件(本篇主要讨论数据文件),它们包含特定领域的数据,例如文本文件、图像文件、音频文件、视频文件等。数据文件用于存储和保存实际的数据内容,这些数据可以被程序文件读取、处理和操作。

数据文件可以存储各种类型的数据,例如文本文件中存储文本内容,图像文件中存储图像数据等。

常见的数据文件类型:

  1. 文本文件:

    • .txt文件:存储文本内容,例如存储程序代码、日志文件等。
    • .csv文件:存储以逗号分隔的数据,例如存储表格数据、统计数据等。
    • .json文件:存储以JSON格式表示的数据,例如存储配置文件、API响应数据等。
    • .xml文件:存储以XML格式表示的数据,例如存储配置文件、数据传输等。
    • .html文件:存储超文本标记语言,用于网页的展示。
  2. 图像文件:

    • .jpg或.jpeg文件:用于存储压缩的数字图像,常用于照片和图像的传输和显示。
    • .png文件:用于存储无损压缩的数字图像,支持透明背景,常用于Web图像和图形设计。
    • .gif文件:用于存储动画图像,支持多帧的图像文件格式。
    • .bmp文件:无损位图格式,用于存储图像数据的原始位图信息。
  3. 音频文件:

    • .mp3文件:常用的音频压缩格式,用于存储音乐、声音等。
    • .wav文件:无损音频格式,用于存储音频数据的原始波形信息。
  4. 视频文件:

    • .mp4文件:常用的视频压缩格式,用于存储视频数据,适合在Web和移动设备上播放。
    • .avi文件:Windows系统中常用的视频格式,支持多种视频和音频编解码器。
    • .mov文件:苹果公司开发的视频格式,通常用当谈到数据文件时

2.3之间的区别 

程序文件包含计算机程序的代码和指令,用于实现特定功能,并由计算机解释和执行。而数据文件则是存储实际数据信息的文件,供程序文件读取、处理和操作。简单来说,程序文件是计算机指令的集合,控制计算机的行为;数据文件是实际数据的存储媒介,供程序文件使用。

三、文件名 

文件名是指文件在文件系统中的名称。它是用来标识特定文件的字符串,并用于定位、访问和识别文件。文件名通常包括两部分:文件的名称和文件的扩展名(后缀)

  1. 文件名称:文件名称是文件的主要标识,用于描述文件的内容或作用。文件名称可以由字母、数字和一些特殊字符组成,但通常不包含文件系统不允许的特殊字符和空格。文件名称一般应具有描述性,以方便用户和开发者快速识别和查找文件。例如,对于一个名为"example.txt"的文本文件,"example"就是文件的名称。

  2. 扩展名(后缀):扩展名是文件名中的一部分,用于标识文件的类型或格式。扩展名出现在文件名的最后,通常由一个点(.)和几个字母组成。扩展名可以直接指示用于打开或处理文件的程序。例如,对于一个名为"example.txt"的文本文件,".txt"就是该文件的扩展名,它表示这是一个文本文件。

 而一个文件要有一个唯一的文件标识,以便用户识别和引用。
而我们更常说的文件名包含3部分:文件路径+文件名主干+文件后缀
例如:  C:\code\test.txt
为了方便,文件标识常被称为文件名。

四、 二进制文件和文本文件 

 按照数据的组织形式,我们又把数据文件称为二进制文件(文本文件)

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

⼀个数据在内存中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 如有整数10000,如果以ASCII码的形式输出到磁盘,磁盘读取的信息就是,‘1’,‘0’,‘0’,‘0’,‘0’,则磁盘中占用5个字节(每个字符⼀个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2019测试)。

五、文件的打开和关闭

 4.1流和标准流

4.1.1流

在计算机科学中,流(Stream)是一种用于在程序和外部设备之间传输数据的概念,我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对文件、画面、键盘等的数据输入输出操作都是同流操作的。
⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作

4.1.2标准流

 我们操作文件需要打开流,为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语言程序在启动的时候,默认打开了3个流:
        •    stdin - 标准输入流,在大多数的环境中从键盘输入。
        •    stdout - 标准输出流,大多数的环境中输出至显示器界面。
        •    stderr - 标准错误流,大多数环境中输出到显示器界面。
这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。 stdin、stdout、stderr三个流的类型是:  FILE* ,通常称为文件指针。
C语言中,就是通过  FILE* 的文件指针来维护流的各种操作的。

4.2文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了⼀个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

struct _iobuf {char* _ptr;int   _cnt;char* _base;int   _flag;int   _file;int   _charbuf;int   _bufsiz;char* _tmpfname;
};
typedef struct _iobuf FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建⼀个FILE结构的变量,并填充其中的信 息,使用者不必关心细节。
⼀般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加⽅便。

创建一个 FILE的指针变量:

FILE* pf;

 定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是⼀个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。

4.3文件的打开和关闭

 文件的操作一共有三步:

1.打开文件

2.操作文件

3.关闭文件

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

4.3.1 fopen

fopen可以在cplusplus网查询: 

fopen - C++ Reference (cplusplus.com)

 函数原型如下:

FILE * fopen ( const char * filename, const char * mode );

函数介绍如下:

函数的使用和案例如下:

fopen的介绍

fopen的介绍:

fopen的原型中有两个形参, const char * filename, const char * mode,filename就是一个文件名,我们这里说的文件名,通常都是文件路径+文件名主干+文件后缀,其次是mode,mode有方式方法的意思,这里说的就是我们用什么方式打开这个文件,方式对应的是表格中的字符

这里是edge的翻译如下: 

4.3.2 fclose 

fclose可以在cplusplus查询: 

fclose - C++ Reference (cplusplus.com)

 fclose的介绍:

 fclose的功能和使用案例:

 fclose的介绍

 fclose函数是C语言中用于关闭文件的函数。它用于将打开的文件与文件指针断开连接,并释放相关资源。ANSIC规定使用  fopen 函数来打开文件,fclose 来关闭文件。注意,在关闭文件之前,务必确保对文件的所有读写操作都已完成,否则可能会导致数据丢失或其他错误。此外,如果文件未成功打开(文件指针为NULL),则不应使用fclose函数来关闭文件。

fopen和fclose的使用 

打开当前目录中的文件: 

#include<stdio.h>int main()
{FILE* pf = fopen("text.txt", "r");if (pf == NULL){perror("fopen");return ;}fclose(pf);pf = NULL;
}

fopen和fclose的使用如上,在上述示例中,先使用fopen函数打开一个文件text.txt并获得一个文件指针,然后对文件进行操作,最后使用fclose函数关闭文件。关闭文件后,可以确保在程序中不再使用该文件。 

如果我们并未发现文件,我们就使用perror直接打印出错误信息。

效果如下:

 打开成功:

打开绝对路径的文件: 

#include<stdio.h>int main()
{FILE* pf = fopen("E:\\Users\\云山若汐\\Desktop\\新建 文本文档 (2).txt", "r");if (pf == NULL){perror("fopen");return ;}fclose(pf);pf = NULL;
}

失败:

成功:

 打开相对路径,C语言用.表示当前目录,..表示上一级目录

 这是我的当前路径:C:\Users\云山若汐\source\repos\test2\test2

而我现在把文件放到repos下:

我的文件路径可以写成./../../test.txt

#include<stdio.h>int main()
{FILE* pf = fopen("./../../test.txt", "w");if (pf == NULL){perror("fopen");return ;}fclose(pf);pf = NULL;
}

失败: 

成功:

 文件操作的表格:

感谢各位同伴的支持,本期文件操作篇就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞关注+收藏,若有不足,欢迎各位在评论区讨论。    

相关文章:

【C语言】文件操作篇-----程序文件和数据文件,文件的打开和关闭,二进制文件和文本文件,fopen,fclose【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作篇-----程序文件和数据文件&#xff0c;文件的打开和关闭&#xff0c;二进制文件和文本文件【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 在了解完动态内存管…...

知识碎片收集

目录 1. 如何计算两点经纬度之间的距离2. 加权随机采样3.什么时LLDB和GDB 1. 如何计算两点经纬度之间的距离 1.知乎-如何计算两点经纬度间距离 2.根据两点经纬度坐标计算距离 3.根据经纬度计算两点之间的距离的公式推导过程以及google.maps的测距函数 4.根据经纬度点计算经…...

不可不知!用例图的绘制与应用全指南深度解析

在软件开发领域中&#xff0c;用例图是一种强大的工具&#xff0c;用于描述系统的功能需求以及系统与外部实体之间的交互。无论是在需求分析阶段还是在系统设计过程中&#xff0c;用例图都扮演着至关重要的角色。本文将全面介绍用例图的绘制方法和其在软件开发中的应用&#xf…...

【数据结构七】堆与PriorityQueue详解

堆 在Java中有一种数据结构基于队列&#xff0c;并保证操作的数据带有优先级&#xff0c;该数据结构应该提供了两个最基本的操作&#xff0c;一个是返回最高优先级对象&#xff0c;一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)。它的底层使用了堆这种数据结…...

uniapp写支付的操作

支付的时候一般需要几个参数&#xff1a; ‘timeStamp’: 时间戳,‘nonceStr’: 随机字符串&#xff0c;不超过32位‘package’: 下单后接口返回的prepauid‘signType’: 签名的算法‘paySign’: 后端会给前端一个签名sign: data.sign // 根据签名算法生成签名 <template&…...

微信小程序开发系列(二十四)·wxml语法·列表渲染·wx:for-item 和 wx:for-index

目录 1. 如果需要对默认的变量名和下标进行修改&#xff0c;可以使用wx:for-item 和 wx:for-index 2. 将 wx:for 用在 标签上&#xff0c;以渲染一个包含多个节点的结构块 方法一 方法二 3. 总结 3.1 wx:for-item 和 wx:for-index总结 3.2 总结 1. 如果需要对默…...

下载无水印抖音视频

在抖音看到某些视频想下载&#xff0c;却出现无法保存在本地【显示"作品暂时无法保存,链接已复制"】。或者下载的视频有水印。 而某些微信小程序下载可能需要付费或者有水印。其实我们可以直接使用电脑浏览器直接下载。 举个例子: 这是来自王道官方账号的一条视频链…...

L1-039 古风排版(C++)

中国的古人写文字&#xff0c;是从右向左竖向排版的。本题就请你编写程序&#xff0c;把一段文字按古风排版。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;<100&#xff09;&#xff0c;是每一列的字符数。第二行给出一个长度不超过1000的非空字符串&a…...

springboot项目docker分层构建

一、需求场景 在使用dockerfile构建springboot项目时&#xff0c;速度较慢&#xff0c;用时比较长&#xff0c;为了加快构建docker镜像的速度&#xff0c;采用分层构建的方式 二、构建配置 1、pom.xml配置 <properties><project.build.sourceEncoding>UTF-8<…...

深入理解SPA、CSR与SSR的区别及应用

随着Web技术的快速发展&#xff0c;前端开发架构也在不断演进。在现代Web应用中&#xff0c;单页面应用&#xff08;SPA&#xff09;、客户端渲染&#xff08;CSR&#xff09;和服务器端渲染&#xff08;SSR&#xff09;是三种常见的实现方式&#xff0c;它们各自拥有独特的特性…...

基于电鳗觅食优化算法(Electric eel foraging optimization,EEFO)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…...

将SQL数据库转换为Mysql数据库

一、准备工作 1、SQL server安装包与已经有数据的mdf、ldf数据库文件&#xff1b; 2、.net Framework安装包&#xff1b;&#xff08;用于支持SQL Server安装的组件&#xff09; 3、MySql安装包&#xff1b;&#xff08;用于目标数据库的环境安装&#xff09; 4、navicat安装包…...

Java集合进阶

双列集合 单列集合的特点&#xff1a;一次添加一个。 双列集合的特点&#xff1a;一次添加一对/键值对/键值对对象/Entry。 左键&#xff08;不可重复&#xff09;右值&#xff08;可重复&#xff09;&#xff0c;一一对应。 Map是双列集合的顶层接口&#xff0c;他的功能是…...

一.算法基础

目录 1.算法基础 2.算法概念 3.时间复杂度--用来评估算法运行效率的一个式子 如何简单快速的判断算法复杂度? 4.空间复杂度 1.算法基础 2.算法概念 --静态动态 3.时间复杂度--用来评估算法运行效率的一个式子 ----一个单位!!! 1-在什么配置下运行(机器) 2-问题的规模…...

python自学7

第二章第一节面向对象 程序的格式都不一样&#xff0c;每个人填写的方式也有自己的习惯&#xff0c;比如收集个人信息&#xff0c;可能有人用字典字符串或者列表&#xff0c; 类的成员方法 类和对象 构造方法 挨个传输值太麻烦了&#xff0c;也没有方便点的&#xff0c;有&…...

Umi - 刷新后页面报404

Umi 项目本地运行刷新没问题&#xff0c;但是部署之后刷新页面报404。因为Umi 默认是用 browser 模式&#xff0c;需要做一下处理。 以下是官方给出解决方案。 一、解决方案 1. 方案一&#xff1a;改用hashHistory .umirc.js {history: { type: hash }, }这个方案项目打包…...

图片编辑器tui-image-editor

提示&#xff1a;图片编辑器tui-image-editor 文章目录 前言一、安装tui-image-editor二、新建components/ImageEditor.vue三、修改App.vue四、效果五、遇到问题 this.getResolve is not a function总结 前言 需求&#xff1a;图片编辑器tui-image-editor 一、安装tui-image-ed…...

如何使用“ubuntu移动文件、复制文件到其他文件夹“?

一、移动文件到其他文件夹命令 mv node_exporter-1.5.0.linux-amd64.tar.gz /usr/local/etc/prometheus 二、复制文件到其他文件夹命令 cp node_exporter-1.5.0.linux-amd64.tar.gz /home/master...

python实现B/B+树

python实现–顺序查找 python实现–折半查找 python实现–分块查找 python实现B/B树 B树和B树都是一种多路搜索树&#xff0c;用于对大量数据进行排序和查找。它们在数据库系统中被广泛应用&#xff0c;特别是用于构建索引结构。 B树&#xff08;B-Tree&#xff09; B树&…...

感觉捡到宝了!这究竟是哪位大神出的神器?

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…...

Vue教学17:Element UI基础组件上手,打造美观实用的Vue应用

大家好&#xff0c;欢迎回到我们的Vue教学系列博客&#xff01;在前十六篇博客中&#xff0c;我们学习了Vue.js的基础知识、安装Node.js与npm、使用Vue Devtools进行调试、Vue实例与生命周期钩子、数据绑定&#xff08;单向与双向&#xff09;、计算属性与侦听器、条件渲染和列…...

从政府工作报告探计算机行业发展(在医疗健康领域)

从政府工作报告探计算机行业发展 政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&…...

ElasticSearch学习篇10_Lucene数据存储之BKD动态磁盘树

前言 基础的数据结构如二叉树衍生的的平衡二叉搜索树通过左旋右旋调整树的平衡维护数据&#xff0c;靠着二分算法能满足一维度数据的logN时间复杂度的近似搜索。对于大规模多维度数据近似搜索&#xff0c;Lucene采用一种BKD结构&#xff0c;该结构能很好的空间利用率和性能。 …...

运维实习生 - 面经 - 游族网络

2024.3.5 Boss投递 2024.3.6 回复 2024.3.8过初筛 2024.3.13面试 确认候选人姓名 自我介绍 我看你更多是做数据分析的&#xff1f; 你是实习的时候才接触Linux&#xff1f; 软件工程不应该是往开发方面发展的吗&#xff1f; 你最近有做运维方面的工作吗&#xff0c;技术…...

SpringBoot接口添加IP白名单限制

实现流程&#xff1a; 自定义拦截器——注入拦截器——获取请求IP——对比IP是否一致——请求返回 文章背景&#xff1a; 接口添加IP白名单限制&#xff0c;只有规定的IP可以访问项目。 实现思路&#xff1a; 添加拦截器&#xff0c;拦截项目所有的请求&#xff0c;获取请求的…...

用postman进行web端自动化测试

前言 概括说一下&#xff0c;web接口自动化测试就是模拟人的操作来进行功能自动化&#xff0c;主要用来跑通业务流程。 主要有两种请求方式&#xff1a;post和get&#xff0c;get请求一般用来查看网页信息&#xff1b;post请求一般用来更改请求参数&#xff0c;查看结果是否正…...

基于Java+SpringBoot+vue+element疫情物资捐赠分配系统设计和实现

基于JavaSpringBootvueelement疫情物资捐赠分配系统设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录 基于JavaSpringBootvueelement疫情物资捐赠…...

(差分)胡桃爱原石

琴团长带领着一群胡桃准备出征&#xff0c;进攻丘丘人&#xff0c;出征前&#xff0c;琴团长根据不同胡桃的战力&#xff0c;发放原石作为军饷&#xff0c;琴团长分批次发放&#xff0c;每批次会给连续的几个胡桃发放相同的原石&#xff0c;琴团长最后想知道给每个胡桃发放了多…...

二级Java程序题--01基础操作:源码大全(all)

目录 1.基本操作&#xff08;源代码&#xff09;&#xff1a; 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.20 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 1.29 1.30 1.31 1.32 1.33 1.34 1.…...

伪分布HBase的安装与部署

1.实训目标 &#xff08;1&#xff09;熟悉掌握使用在Linux下安装伪分布式HBase。 &#xff08;2&#xff09;熟悉掌握使用在HBase伪分布式下使用自带Zookeeper。 2.实训环境 环境 版本 说明 Windows 10系统 64位 操作电脑配置 VMware 15 用于搭建所需虚拟机Linux系统 …...