【C语言基础】:文件操作详解(前篇:准备知识)

文章目录

      • 一、什么是文件以及文件的分类
        • 1.1 程序文件
        • 1.2 数据文件
        • 1.3 文件名
      • 二、文本文件和二进制文件
        • 2.1 数据在文件中的存储
      • 三、文件的打开和关闭
        • 3.1 流和标准流
          • 3.1.1 流
          • 3.1.2 标准流
        • 3.3 文件指针
        • 3.5 文件的打开和关闭

一、什么是文件以及文件的分类

文件是指存储在计算机或其他电子设备上的数据集合,通常用来存储文本、图像、音频、视频或其他类型的信息。

在程序设计中,从文件的功能上可以将文件分为:程序文件数据文件

1.1 程序文件

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

1.2 数据文件

文件内容为程序运行时读写的数据,比如程序运行需要从中读取数据或则输出内容的文件。

1.3 文件名

⼀个文件要有⼀个唯⼀的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如:

D:\C语言程序1-VS\C语言基础\C语言基础\文件操作.c

文件识标常被称为文件名

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

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

2.1 数据在文件中的存储

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

【示例】
假设一个整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2019测试)。
在这里插入图片描述

#include<stdio.h>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 流

流(Stream)是计算机中用来处理输入输出的抽象概念。流可以被视为数据在程序之间传输的方式,通常是连续的数据序列。流可以是输入流(Input Stream)用于从外部获取数据,也可以是输出流(Output Stream)用于向外部发送数据。

流的特点包括:

  • 连续性: 流是一系列连续的数据,通常以字节的形式组成。

  • 单向性: 流通常是单向的,即输入流只能用于读取数据,输出流只能用于写入数据。

  • 抽象性: 流提供了一个抽象的接口,隐藏了底层数据源(如文件、网络连接等)的细节,使得程序可以以相同的方式处理不同类型的数据源。

  • 实时性: 流可以实时处理数据,适用于处理大量数据或需要即时处理的场景。

C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

流的操作通常包括读取和写入数据。具体来说,流的操作可以分为以下几类:

  • 打开流: 在使用流之前,需要先打开流,以便程序可以访问数据源。对于文件流,打开操作通常涉及指定文件路径和打开模式(读取、写入、追加等)。

  • 关闭流: 在流使用完毕后,应该及时关闭流,以释放资源并确保数据的完整性。关闭流操作可以保证数据的正确写入,并释放系统资源。

  • 读取数据: 对于输入流,常见的操作是从流中读取数据。这包括读取单个字节、一行数据或一定数量的字节等。

  • 写入数据: 对于输出流,常见的操作是向流中写入数据。这包括写入单个字节、一行数据或一定数量的字节等。

  • 定位操作: 对于某些流,可以进行定位操作,即将读写位置移动到指定位置。这样可以实现在流中随机访问数据的功能。

  • 刷新操作: 对于输出流,有时需要手动刷新流,以确保数据被及时写入到目标位置,而不是停留在缓冲区中。

  • 异常处理: 在进行流操作时,应该考虑可能发生的异常情况,如文件不存在、权限不足等,需要进行适当的异常处理,以确保程序的稳定性和健壮性。

3.1.2 标准流

在C程序中输入输出数据时,我们会发现我们并没有打开流的操作。这是因为C语言程序在启动的时候,默认打开了三个流:

  • stdin --> 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
  • stdout --> 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出
    流中。
  • stderr --> 标准错误流,大多数环境中输出到显示器界面。

这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为文件指针
C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。

3.3 文件指针

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

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

FILE* 类型指针变量的创建:

FILE* pf;  //文件指针变量

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

【示例】
在这里插入图片描述

3.5 文件的打开和关闭

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

fopen函数原型:

FILE * fopen ( const char * filename, const char * mode );
  • filename:要打开的文件名。
  • mode:文件的打开模式。

fclose函数原型:

int fclose ( FILE * stream );
  • stream:指向 FILE 对象的指针,该 FILE 对象由之前成功的 fopen 调用返回。
  • 如果成功关闭文件,fclose 返回 0。
  • 如果关闭过程中出现错误,它会返回,并且错误码会被设置在全局变量 errno 中。

mode表示文件打开模式:

  • “r”(只读):为了输入数据,打开一个已经存在的文本文件,如果指定文件不存在,则出错
  • “w”(只写):为了输出数据,打开一个文本文件,如果指定文件不存在,则建立一个新的文件
  • “a”(追加):向文本文件尾添加数据,如果指定文件不存在,则建立一个新的文件
  • “rb”(只读):为了输入数据,打开一个二进制文件,如果指定文件不存在,则出错
  • “wb”(只写):为了输出数据,打开一个二进制文件,如果指定文件不存在,则建立一个新的文件
  • “ab”(追加):向一个二进制文件尾添加数据,如果指定文件不存在,则建立一个新的文件
  • “r+”(读写):为了读和写,打开一个文本文件,如果指定文件不存在,则出错
  • “w+”(读写):为了读和写,建立一个新的文件
  • “a+”(读写):打开一个文件,在文件尾进行续写。
  • “rb+”(读写):为了读和写打开一个二进制文件

【示例】

#include<stdio.h>
int main()
{FILE* pf;  // 创建文件指针变量pf = fopen("test.txt", "w");  // 打开文件if (pf == NULL){perror("fopen");return 1;}// 文件操作fputs("hello world", pf);// 关闭文件fclose(pf);pf = NULL;return 0;
}

free函数一样,fclose关闭文件后不会把pf置为空指针,为了避免之后误访问pf,我们要主动把pf置为空指针。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

编程新手必看,学习python中字符串数据类型内容(8)

1、 Python3 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号( ’ 或 " )来创建字符串。 创建字符串很简单&#xff0c;只要为变量分配一个值即可。例如&#xff1a; var1 Hello World! var2 "Runoob"Python 访问字符串中的值 Python 不支持单…

Linux(centos7)部署spark

Spark部署模式主要有4种&#xff1a;Local模式&#xff08;单机模式&#xff09;、Standalone模式&#xff08;使用Spark自带的简单集群管理器&#xff09;、Spark On Yarn模式&#xff08;使用YARN作为集群管理器&#xff09;和Spark On Mesos模式&#xff08;使用Mesos作为集…

机器学习模型——关联规则

目录 关联规则 - 基本概念 关联规则的挖掘步骤: Apriori算法 Apriori算法简介&#xff1a; Apriori算法举例&#xff1a; Apriori算法优缺点&#xff1a; Apriori算法应用 FP-growth算法&#xff1a; FP-growth算法简介&#xff1a; FP-growth的数据结构&#xff1a; …

AI帮助写代码:在python中,如何替换字符串中指定位置的字符

用python编写一段代码&#xff0c;在下面的字符串中:#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#27#28#29&#xff0c;从第2个‘#开始&#xff0c;每个#前面加一个字符串 or ‘。 # 原始字符串 s "#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#…

多线程学习-线程池

目录 1.线程池的作用 2.线程池的实现 3.自定义创建线程池 1.线程池的作用 当我们使用Thread的实现类来创建线程并调用start运行线程时&#xff0c;这个线程只会使用一次并且执行的任务是固定的&#xff0c;等run方法中的代码执行完之后这个线程就会变成垃圾等待被回收掉。如…

2024最新GPT4.0使用教程:GPTs,AI绘画,AI换脸,AI绘画,文档分析一站式解决

一、前言 ChatGPT3.5、GPT4.0、相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GPT-4对普通用户来说都是需要额外付费才可以…

超强AI辅助工具:BitoCLI的简单使用

今天要推荐一个爱不释手的好东西–Bito; 从事相关工作的人大概率在自己的代码编辑器中已经用上了Bito的插件版本&#xff0c;所以这里主要介绍的是一个适合与所有人且方便快捷的Bito CLI&#xff0c;也就是Bito的命令行版本。 BitoCLI 从官方介绍来看&#xff0c;这是一款为 …

卸载不留痕,App Cleaner Uninstaller助你打造清爽Mac

在数字时代&#xff0c;我们的Mac设备上积累了大量的应用程序&#xff0c;其中一些可能不再需要或不再使用。随着时间的推移&#xff0c;这些不再使用的应用程序可能会占用宝贵的存储空间&#xff0c;影响设备的性能。为了解决这个问题&#xff0c;App Cleaner & Uninstall…

【C+ +初阶】前言篇章---C+ +的广袤

目录 1.C语言到C的过渡 2.C的发展历程 2.1C语言的诞生 2.2 c的历史版本 3.c 的地位 4. c的应用场景 4.1. 操作系统以及大型系统软件开发 所有操作系统几乎都是C/C写的 4.2. 服务器端开发 后台开发&#xff1a; 4.3. 游戏开发 4.4. 嵌入式 4.5. 数字图像处理 4.6. 人工智能 4.7.…

初始Java篇(JavaSE基础语法)(6)(继承和多态)(上)

Java学习篇 个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 继承篇 为什么需要继承&#xff1f; 继承概念 继承的语法 父类成员访问 super关键字 子类构造方法 super和this的比较 再谈…

深度学习十大算法之深度Q网络(DQN)

一、简介 深度Q网络&#xff08;DQN&#xff09;是一种结合了深度学习和强化学习的算法&#xff0c;它在近年来成为了人工智能领域的一个热点。DQN首次被引入是在2013年&#xff0c;由DeepMind的研究人员开发。它标志着深度学习技术在解决高维度决策问题上的一大突破。 DQN的…

Python可视化之pandas

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.解决坐标轴刻度负号乱码2.解决中文乱码问题3.折线图Series.plot()&DataFrame.plot()4.条形图5.箱线图6.区域面积图&#xff08;堆积折线图&#xff09;7.散点…

Ideal的使用技巧

一、springcloud项目如何将多个服务放到services中一起启动 1、打开ideal&#xff0c;再view -> Tool Windows -> services 2、在services界面 找到 run configuration type -> springboot即可 二、配置临时的启动参数 1、在edit configurations中 2、选择相应的服务…

关于Linux下的进程状态(进程篇)

目录 Linux操作系统的一般进程状态 关于阻塞 关于挂起 Linux内核状态源代码&#xff1a; 关于僵尸进程 关于孤儿进程 Linux操作系统的一般进程状态 新建&#xff1a;字面意思运行&#xff1a;task_struct结构体在运行队列中排队&#xff0c;就叫做运行态阻塞&#xff1a;等待非…

基于springboot实现学科竞赛管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现学科竞赛管理系统演示 摘要 随着国家教育体制的改革&#xff0c;全国各地举办的竞赛活动数目也是逐年增加&#xff0c;面对如此大的数目的竞赛信息&#xff0c;传统竞赛管理方式已经无法满足需求&#xff0c;为了提高效率&#xff0c;竞赛管理系统应运而生。…

计算机语言 之【C++】入门级知识讲解(命名空间,C++输入输出,缺省参数,函数重载,引用,内敛函数,auto关键字,for循环,指针空值nullptr)

三点睡六点起&#xff0c;阎王夸我好身体 不到三点我不睡&#xff0c;太平间里抢C位 一、命名空间 1.命名空间的作用 2.命名空间定义 3.命名空间使用 二、C的输入输出 1.输入输出说明介绍 2.std命名空间的使用惯例 三、缺省参数 1.缺省参数概念 2.缺省参数分类 四、…

“Linux 三剑客”,通常指的是三个经典的命令行工具:grep、sed 和 awk

1、grep&#xff1a; 简介&#xff1a;grep 是一个强大的文本搜索工具&#xff0c;可以用于在文件中查找匹配特定模式的行。示例&#xff1a; 搜索包含特定关键词的行&#xff1a; grep "keyword" filename 递归搜索目录下所有文件&#xff1a; grep -r define zj…

C++要点细细梳理(下)(内存分配、异常处理、template和文件读写)

4. 类动态内存分配 4.1 C语言动态内存分配&#xff1a;malloc和free 4.2 C动态内存分配&#xff1a;new和delete 思考&#xff1a;定义一个对象和定义一个普通变量有何区别? 普通变量:分配足够空间即可存放数据对象:除了需要空间&#xff0c;还要构造/析构 类比&#xff1a;…

路由策略与路由控制之双点双向重发布(OSPF-ISIS)实验

双点双向重发布在路由协议中&#xff0c;特别是在OSPF&#xff08;开放式最短路径优先&#xff09;与IS-IS&#xff08;中间系统到中间系统&#xff09;等协议之间&#xff0c;指的是在两个协议间或者两个进程间进行路由信息共享的机制。这种机制涉及到在两个不同的协议区域使用…

isc-dhcp-server DNS配置

我遇到一个有趣的问题&#xff0c;我先在一台Ubuntu服务器上使用isc-dhcp-server在其其中一个网口运行DHCP服务&#xff0c;然后我自己的笔记本电脑直连到这个网口&#xff0c;来上网。 本来直接就应该能上网&#xff0c;但是我的电脑只有在打开Clash时才能访问互联网&#xf…