C语言的文件基础知识

一、文件存在的意义

① 文件的定义是什么?

文件是以单个名称在计算机上存储的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 JPEG 格式保存并且文件扩展名为 .jpg)(文件的范畴很广,比如运行的程序,杀毒的软件之类的,都叫做文件。) 

(总之:所谓“文件”,就是在我们的电脑中,以实现某种功能、或某个软件的部分功能为目的而定义的一个单位。)

② 文件的作用是什么?

首先我们要知道,在通常情况下,我们在编译器中编写的代码,每次关闭编译器再打开,上次使用的代码总是仍然存在,这就是因为电脑将它们存储到了"文件"中,而如果没有文件,就无法保存信息,导致数据丢失。

这就引出了文件的作用:文件能够将数据进行持久化的保存。

③ 什么是文件?

在程序设计中,一般有两种文件:程序文件、数据文件(从文件功能的角度来分类的)。

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

2. 数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

在之前我们所了解到的,处理数据的方式都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。而有时当我们将运行结果显示到显示器上时,其实过程是将信息输出到磁盘上,需要时再调出(读取到内存中)使用。

让我们看一段最最简单的代码作为例子:

int main(void)
{printf("hello world!!!\n");return 0;
}

运行代码后会将结果输出到显示器,并且还会显示出其代码路径

然后我们可以通过代码路径寻找到这个程序

这就是一个"程序文件"

而当我们返回刚刚的路径"C",会发现里面还有一个"debug":

他们也都属于"程序文件"

而如果此时我们再此路径下,我们再右键创建出一个文件,那么这个文件就可被称为"数据文件"

④ 文件名

文件要有独特的标识,便于对文件的查找与存储。

文件名的三个部分:文件路径 + 文件名主干 + 文件后缀

比如:C:\Users\10720\data.txt

为了方便起见,文件标识通常被称为 文件名 。

⑤ 二进制文件与文本文件

文件是用来存储数据的,而根据数据的形式,还要细分为:文本文件二进制文件

1. 二进制文件:顾名思义,就是将数据在内存中以二进制的形式存储,并且不加以任何的转换输出到外存文件中。

2. 文本文件:将数据转换成ASCII码的形式后,再输出到外存文件中。

接下来让我们看一下,这两种文件的存储形式:

比如此时,我们想将一个整数20000在内存中存储,然后我们想将它分别的在"二进制文件""文本文件"中存储,那么会是怎样的形式呢:

我们用代码来运行一下看看:

int main()
{int a = 20000;FILE* pf = fopen("data.txt", "wb");fwrite(&a, 4, 1, pf);fclose(pf);pf = NULL;return 0;
}

(这个代码看不懂不要紧,我们马上就会讲到,此时我们只需要知道这段代码的作用是将20000的二进制形式写入文件中就好)

此时我们就将20000写入了"data.txt"中(二进制文件)。

接下来让我们选择打开方式,对此文件的内容进行查看

我们选择"二进制编译器":

最后读取到的内容为

这是因为为了节省空间,存储时将2进制的格式又改成了16进制存储:

二、文件的打开与关闭

① 流和标准流

💧流:在进行代码的编写时,我们会创造出很多不同的数据,而这些数据有时需要输出到各种外部设备,有时还需要从外部设备获取数据,而不同外部设备下,输入与输出也都有不同,而为了时输入输出更加方便,便有了"流"的概念~我们可以把"流"想象成一个流淌着字符的河~

有了流,也就有了标准流的概念:

而既然有了流,就说明我们平常编写代码时,肯定不是直接就实现了数据的输入输出,而是有着潜在的"流"在暗中为我们的输入输出推波助澜~

在C语言程序启动时,默认打开了三个流

• stdin-标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。

• stdout-标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出 流中。

• stderr-标准错误流,大多数环境中输出到显示器界面。

也就是因为这三个流,才能够使我们使用输入(scanf)输出(printf)函数时直接就能输入输出。

stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为文件指针。

② 文件指针

和之前我们学习过的各种指针一样,函数指针是一个指向函数的指针变量数组指针是一个指向数组的指针变量而文件指针,就是一个指向文件的指针变量。

我们知道,文件的作用是用来使数据持久化的保存。那么当我们想要创建一个文件的时候,我们需要对其命名,并且需要文件能够存储对应的路径而存储这些还需要它能够接收各种数据。

而怎么让文件拥有这些功能呢?其实每次使用文件时,都会在内存中开辟一个对应的文件信息区。

这个文件信息区用来存放文件的相关信息,这些信息会被存储在一个结构体变量中,此结构体类型是由系统声明的,取名 FILE。

例如由 VS2013 编译环境提供的 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结构变量。

那么让我们看看如何来创建一个 FILE* 的指针变量:

FILE* pf;

定义了一个文件指针型变量pf,用于指向FILE类型数据,如图:

③ 文件的打开与关闭

当我们进行对文件的操作时,对文件的打开和关闭是必不可少的操作。

在我们编写程序,想要实现对文件的读写前,我们需要先打开一个文件,我们可以看到fopen的参数:filename 是文件名,其代表的就是想要进行操作的对应文件(有时文件并不在程序中,我们可以将此处替换成此文件的绝对路径)。

mode 代表的是文件的打开模式,文件的打开模式:

(文件打开成功时,返回文件起始位置的文件指针;文件打开失败时,返回空指针NULL!!!)

文件使用方式含义如指定文件不存在
"  r "(只读)为了输入数据,打开一个已经存在的文本文件出错
" w "(只写)为了输出数据,打开一个文本文件建立一个新文件
" a "(追加)像文本文件尾添加数据建立一个新文件
" rb "(只读)为了输入数据,打开一个二进制文件出错
" wb "(只写)为了输出数据,打开一个二进制文件建立一个新文件
" ab "(追加)向一个二进制文件尾添加数据出错
" r+ "(读写)为了读和写,打开一个文本文件出错
" w+ "(读写)为了读和写,建立一个新的文件建立一个新文件
" a+ "(读写)打开一个文件,在文件尾进行读写建立一个新文件
" rb+ "(读写)为了读和写,打开一个二进制文件出错
" wb+ "(读写)为了读和写,新建一个新的二进制文件建立一个新文件
" ab+ "(读写)打开一个二进制文件,在文件尾进行读和写建立一个新文件

而既然我们打开了一个文件,相应的就需要关闭文件:

此函数的作用就是用于关闭文件。

FILE* stream 指的是想要关闭的文件。

(关闭文件后,需要将pf置空,否则pf会变成危险的野指针!!!)

(就像之前学习动态内存管理时,使用free释放内存后,需要再置空一次~)

那么既然了解了文件的打开与关闭,现在让我们练习一下吧:

int main()
{FILE* pf = fopen("data1.txt", "w");//检查是否打开失败if (pf == NULL){perror("fopen");return 1;}fclose(pf);//防止pf变成野指针pf = NULL;
}

在我们运行此代码之前,我们的文件中是没有"data1.txt"的,而当我们运行代码后,再进行查看,会发现文件中出现了"data1.txt"。

这是因为 " w " 在查找不到目标文件时,就会创建一个新文件,并且命名为目标文件的名字。

而当我们将此文件删除,再使用 " r " 来读取该文件会发生什么呢:

没错,就是报错(找不到该文件)。

(如果我们将文件 "data1.txt" 存入其他的文件路径中,那么对 "data1.txt" 的读取是否能够成功呢?)

我们可以看到,这种情况下是无法找到该文件的,那么这时我们就不能找到这个文件了吗?答案是,可以找到~因为此时我们输入的文件名并不完整,所以它找不到另一个文件路径中的该文件,此时我们可以将全部文件名写入:"data1.txt"—>"D:\\data1.txt"

(正常是一个\,写\\会防止\与后面字符结合)

此时我们可以看到,再次进行该文件的查找,就能够找到了~

三、文件的顺序读写

什么是文件的顺序读写?

顾名思义,顺序读写就是一种逐个或逐行地进行输出输入操作读取文件内容的方法。

当我们对文件进行操作时,基本流程大概为:

当我们使用顺序读写的方式去对文件进行操作时:

① 顺序读取

此时我们对文件进行读取,会从文件的开头开始读取,若是读取字符便是一个一个字符的读取,若是读取字符串便是一个一个字符串读取,总之是按照从头到尾的顺序,读取完一个数据后,指针自动向后移动,读取下一个数据。

② 顺序写入

此时我们对文件进行写入,会从文件的开头开始写入每写入一个数据后,写入指针会自动指向下一个位置,从而按照从头到尾的顺序将数据添加到文件中

四、文件的随机读写

顾名思义,文件的随机读写与顺序读写的差别在于:C语言中的随机读写通常指的是,使用随机的形式访问文件中的数据,而并不是按照顺序的去进行访问。随机读写具有灵活性和多变性,适合对文件中的数据进行使用。

那么关于C语言文件的基础知识就为大家分享到这里了,如果有哪里写的不够清楚或者不够详细的,还请各位多多指出,我也会吸取教训多多改正的,那么我们下一期再见啦~

(关于文件的知识有很多!!!在这一篇文章中我们并未讲解完全,这篇文章只是为下一篇文章进行铺垫的基础知识,帮助我们了解文件的各种相关知识,而在下一篇文章中,我们将详细的对文件各种读写函数进行讲解,并且以此篇文章为基础,对文件的相关知识进行更深度的研究~)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Hive企业级调优[4]——HQL语法优化之分组聚合优化

HQL语法优化之分组聚合优化 优化说明 在 Hive 中,未经优化的分组聚合通常通过一个 MapReduce Job 实现。Map 端负责读取数据,并按分组字段进行分区,通过 Shuffle 将数据发送至 Reduce 端,在 Reduce 端完成最终的聚合运算。 Hiv…

网页交互模拟:模拟用户输入、点击、选择、滚动等交互操作

目录 一、理论基础 1.1 网页交互模拟的重要性 1.2 网页交互的基本原理 二、常用工具介绍 2.1 Selenium 2.2 Puppeteer 2.3 Cypress 2.4 TestCafe 三、实战案例 3.1 模拟用户输入 3.2 模拟用户点击 3.3 模拟用户选择 3.4 模拟滚动操作 四、最佳实践与优化 4.1 代…

用 Pygame 实现一个乒乓球游戏

用 Pygame 实现一个乒乓球游戏 伸手需要一瞬间,牵手却要很多年,无论你遇见谁,他都是你生命该出现的人,绝非偶然。若无相欠,怎会相见。 引言 在这篇文章中,我将带领大家使用 Pygame 库开发一个简单的乒乓球…

系统优化工具 | Windows Manager v2.0.5 便携版

Windows Manager 是一款专为Microsoft Windows 10/11设计的系统优化和管理软件。它集成了多种实用程序,旨在帮助用户更好地管理和优化Windows操作系统。该软件的功能包括系统清理、系统优化、系统修复、硬件信息查看和系统设置调整等。 系统清理:Window…

Qt Creator项目模板介绍

在Qt Creator中创建项目时,用户可以从多个模板类别中进行选择,以满足不同的开发需求。 Application(Qt) 在Application(Qt)类别下,Qt Creator提供了多种用于创建不同类型Qt应用程序的模板。这些模板主要包括: Qt Widgets Applic…

前缀和与差分(二维)

二维前缀和 下面是一个二维数组,我们要求(1,1)到(2,2)区间内的所有元素的和,最原始的方法就是遍历每个元素然后一个一个加起来,此时时间复杂度为O(n*m)。 我们之前学过…

【计算机网络篇】电路交换,报文交换,分组交换

本文主要介绍计算机网络中的电路交换,报文交换,分组交换,文中的内容是我认为的重点内容,并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 目录 🎯一.划分…

【实战篇】MySQL是怎么保证主备一致的?

MySQL 主备的基本原理 如图 1 所示就是基本的主备切换流程。 在状态 1 中,客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只是将 A 的更新都同步过来,到本地执行。这样可以保持节点 B 和 A 的数据是相同的。 当需要切换的…

PostgreSQL JAVA与SQL集成之PL/Java

PostgreSQL pljava PL/Java 作为 PostgreSQL 的编程语言扩展之一,与 PL/pgSQL(PostgreSQL 原生的存储过程语言)相比,提供了 Java 语言特有的面向对象功能,并支持 Java 的标准库和第三方库。由于 Java 是一种跨平台的语…

企业搭建VR虚拟展厅,如何选择搭建平台?

选择虚拟展厅搭建平台时,需要综合考虑多个因素以确保平台能够满足您的具体需求并提供高质量的展示效果。以下是一些关键的选择标准: 1. 技术实力与创新能力 技术平台选择:确保平台支持虚拟现实(VR)、增强现实&#xf…

Qt clicked()、clicked(bool)、toggled(bool)信号的区别和联系

clicked() 信号 所属控件:clicked()信号是QAbstractButton类(及其子类,如QPushButton、QRadioButton、QCheckBox等)的一个信号。clicked信号可以说是许多控件(特别是按钮类控件,如QPushButton)…

基于lnmp搭建wordpress

一、案例目标 (1)了解LNMP环境的组成。 (2)了解LNMP环境的部署与安装。 (2)了解WordPress应用的部署与使用。 二、节点规划 IP 主机名 节点 192.168.200.20 lnmp lnmp服务节点 三、案例实施 LN…

C#基于SkiaSharp实现印章管理(8)

上一章虽然增加了按路径绘制文本,支持按矩形、圆形、椭圆等路径,但测试时发现通过调整尺寸、偏移量等方式不是很好控制文本的位置。相对而言,使用弧线路径,通过弧线起始角度及弧线角度控制文本位置更简单。同时基于路径绘制文本时…

2024 新手指南:轻松掌握 Win10 的录屏操作

之前为了节约成本我们公司都采用录制软件操作都方式来为异地的同事进行远程操作培训的。所以我们尝试了不少的录屏工具,这里我就分享下win10怎么录屏的操作过程。 1.福昕录屏大师 链接:www.foxitsoftware.cn/REC/ 这款录屏工具是初学者的理想之选&…

Linux入门2

文章目录 一、Linux基本命令1.1 文件的创建和查看命令1.2 文件的复制移动删除等命令1.3 查找命令1.4 文件的筛选和管道的使用1.5 echo、tail和重定向符 二、via编辑器三、权限控制3.1 root用户(超级管理员)3.2 用户和用户组3.3 权限信息3.4 chmod命令 一…

【python设计模式4】结构型模式1

目录 适配器模式 桥模式 适配器模式 将一个类的接口转换成客户希望的另外一个接口,适配器使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。实现适配器的两种方式,类适配器使用多继承,对象适配器使用组合。组合就是一个类中放入另…

Django-cookie和session

文章目录 前言CookieSession 一、Django 中 Cookie二、Django 中 Session三.区别 前言 Cookie Cookie 是由服务器发送到用户浏览器的小文件,用于存储用户的相关信息。每次用户访问网站时,浏览器会将这些 cookie 发送回服务器 特点: 1. 数据存储在客户…

网络质量劣化分析:保障业务连续性与网络优化的核心步骤

目录 什么是网络质量劣化? 常见的网络质量劣化表现 网络质量劣化的常见原因 1. 网络设备性能不足或老化 2. 网络配置问题 3. 链路拥塞 4. 外部攻击或恶意流量 案例分析:一次企业内部网络劣化的解决过程 如何防止网络质量劣化? 结语…

【图像检索】基于傅里叶描述子的形状特征图像检索,matlab实现

博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于傅里叶描述子的形状特征图像检索,用matlab实现。 一、案例背景和算法…

Python 序列( 列表 字典 元组 集合)

列表简介: 1.列表:用于存储任意数目、任意类型的数据集合。 2.列表是内置可变序列,是包含多个元素的有序连续的内存空间。列表的标准语法格式:a[10,20,30,40]其中,10,20,30,40这些称为:列表a的元素。 3.…