【C语言】深入了解文件:简明指南

简介: 【C语言】深入了解文件:简明指南

一、文件的概念

文件的概念:

文件是一种装载数据和信息的载体,存储着用户输入或者处理得到的各种有用信息,例如:文本文档、图片、音乐和视频等等(从硬盘上的文件是文件)。文件与内存的作用都是用于存储数据,区别在于内存是存储CUP的临时数据,无法持久化保存,会导致数据丢失。因此我们可以使用文件进行持久化保存。

1.1 文件名:

  • 一个文件要有一个唯一的文件标识,便于用户的引用
  • 文件名包括三个部分:文件路径+文件名主干+文件后缀(c:\code\test.txt)
  • 为了方便,文件标识常被称为文件名

1.2 程序文件和数据文件

在程序设计上,根据文件功能,一般分为两种文件:程序文件和数据文件

程序文件(用存储程序的文件):

  • 程序文件包括源程序文件(后缀为.c),目标文件(windows环境下后缀为.obj),可执行程序((windows环境下后缀为.exe)
  • 这里里的"程序"跟计算机技术的程序是不相同的,在这里指的为完成某项活动所规定的方式

数据文件(The data file):

  • 当文件内容不是程序时,而是程序运行时读写的数据(可以是读取数据的文件,也可以是输出内容的文件)。

二、数据文件(The data file)

本篇主要谈论数据文件的相关知识。对于之前处理数据的输出输入都是以终端为对象,终端的键盘输入数据,运行结果显示到显示器上。

有时也会把数据信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用(磁盘上的文件)

2.1 二进制文件和文本文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件

  • 二进制文件(存储二进制信息的文件):数据在内存中以二进制的形式存储,不加转换的输出到外存(磁盘)
  • 文本文件(存储文本信息的文件):数据在内存中以ASCII的形式存储,需要在存储前转换的输出到外存

注意】:字符一律以ASCII形式存储,数值型数据据可以使用ASCII形式存储,也可以使用二进制形式存储

问题】:存储整数10000,以ASCII形式或二进制形式输出到磁盘中,空间的占用情况?

占用情况】:

  • ASCII形式存储:将每一个数据看成一个字符‘1’‘0’‘0’‘0’‘0’‘0’,则磁盘中占用五个字节
  • 二进制形式存储:整型类型占用四个字节
int main()
{
    int a = 10000;
    FILE* pf = fopen("test.txt", "wb");
    fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中
    fclose(pf);
    pf = NULL;
    return 0;
}

检验下:在VS打开二进制文件


三、文件的打开和关闭

3.1 流和标准流

3.1.1 流

不同的外部设备的输入输出操作不同,为了方便统一,对各种设备进行方便的操作,提出了流的概念。

:往往是对一种有序连续具有方向性的数据的抽象描述。(从流读取,先打开流,之后操作)

3.1.2 标准流

问题】:为什么键盘输入数据,向屏幕上输入数据,并没有打开流呢?

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

  • stdin-标准输⼊流,在大多数的环境中从键盘输入
  • stdout-标准输出流,大多数的环境中输出至显示器界面。
  • stderr-标准错误流,大多数环境中输出到显示器界面。

以上三个流的类型是:FILE .*,通常称为文件指针。并且通过文件指针来维护流的各种操作,也导致使用scanf和printf等函数可以直接进行输入输出操作


四、文件指针

每当使用一个文件,都会在内存中开辟一个相应的文件信息区,用来存放文件的相关信息(文件名,文件状态以及文件当前路径)。

这些信息被保存在一个结构体变量,并且该结构体类型是由系统声明的,取名FILE.(一般通过一个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结构的变量,并填充其中的信息(使用者不用关心细节)

文件指针变量指向某个文件的文件信息区(结构体变量),并且通过文件信息区就能访问该文件。(通过文件指针间接访问相关的文件)

4.1 文件的打开和关闭

ANSIC规定使用fopen函数来打开文件, fclose来关闭文件使用文件进行读写,需要三个步骤:

  1. 打开文件
  2. 文件操作
  3. 关闭文件
打开文件
    FILE *fopen(const char *filename,const char *mode);
关闭文件
    FILE *fclose(FILE *stream);

mode表示文件的打开模式,下⾯都是文件的打开模式

⽂件使⽤⽅式 含义 如果指定⽂件不存在
“r”(只读) 为了输⼊数据,打开⼀个已经存在的⽂本⽂件 出错
“w”(只写) 为了输出数据,打开⼀个⽂本⽂件 建⽴⼀个新的⽂件
“a”(追加) 向⽂本⽂件尾添加数据 建⽴⼀个新的⽂件
“rb”(只读) 为了输⼊数据,打开⼀个⼆进制⽂件 出错
“wb”(只写) 为了输出数据,打开⼀个⼆进制⽂件 建⽴⼀个新的⽂件
“ab”(追加) 向⼀个⼆进制⽂件尾添加数据 建⽴⼀个新的⽂件
“r+”(读写) 为了读和写,打开⼀个⽂本⽂件 出错
“w+”(读写) 为了读和写,建议⼀个新的⽂件 建⽴⼀个新的⽂件
“a+”(读写) 打开⼀个⽂件,在⽂件尾进⾏读写 建⽴⼀个新的⽂件
“rb+”(读写) 为了读和写打开⼀个⼆进制⽂件 出错
“wb+”(读写) 为了读和写,新建⼀个新的⼆进制⽂件 建⽴⼀个新的⽂件
“ab+”(读写) 打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写 建⽴⼀个新的⽂件

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二C语言笔记,希望对你在学习C语言中有所帮助!

相关文章
|
21天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
17天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2564 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
15天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
13天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
17天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1556 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
19天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
829 14
|
14天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
621 7
|
8天前
|
Docker 容器
Docker操作 (五)
Docker操作 (五)
170 69
|
8天前
|
Docker 容器
Docker操作 (三)
Docker操作 (三)
167 69
|
19天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
629 53
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界