⽂件操作详解

⽬录
一    文件操作的引入
           1   为什么使⽤⽂件?
           2   什么是⽂件?
           3   文件分类(1 从⽂件功能的⻆度来分类:程序⽂件/数据⽂件 2根据数据的组织形式:为⽂本⽂件/⼆进制⽂件)
二    ⽂件的打开和关闭
           1     流和标准流(其中标准流在C语⾔程序启动的时候,默认打开)
           2    ⽂件指针(⽂件类型指针)
           3    ⽂件的打开和关闭
三    ⽂件的顺序读写
            1   fgect函数
            2   fputc函数
            3   fgets函数
            4   fputs函数
            5   fscanf函数
            6   fprintf函数
            7   fread函数
            8   fwrite函数
              
四    ⽂件的随机读写
             1  fseek函数
             2  ftell函数
             3  rewind函数
五    ⽂件读取结束的判定
             1  ⽂本⽂件读取是否结束/⼆进制⽂件的读取结束判断
             2  ⽂本⽂件的例⼦:
             3   ⼆进制⽂件的例⼦:
六    ⽂件缓冲区

一    文件操作的引入

1   为什么使⽤⽂件?

     为了将数据进⾏持久化的保存,如果我们没有文件我们写的程序的数据其实是存储在电脑的内存中,当我们程序一退出,内存回收,数据就会丢失,等再次运⾏程序,就看不到上次程序的数据。

2   什么是⽂件?

2.1  概念:磁盘(硬盘)上的⽂件是⽂件。

2.2 ⽂件名
⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀
例如: c:\code\test.txt
为了⽅便起⻅,⽂件标识常被称为⽂件名

2.3路径的两种形式(相当路径/绝对路径)

 

3 文件分类(1 从⽂件功能的⻆度来分类:程序⽂件/数据⽂件 2根据数据的组织形式:为⽂本⽂件/⼆进制⽂件)
3.1   从⽂件功能的⻆度来分类:
程序⽂件: 程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)。
数据⽂件 程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。
3.2  根据数据的组织形式
⼆进制⽂件:数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
⽂本⽂件:如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件

二     ⽂件的打开和关闭

  1   流和标准流(其中标准流在C语⾔程序启动的时候,默认打开)

1.1  流:因为不同的外部设备的输⼊输出操作各不相同,此时为了⽅便程序员对各种设备进⾏⽅便的操作便引出了流,其实,流就是为了⽅便程序员对各种设备读取数据或者输出数据的操作,而抽象出的概念,这里我们可以把流想象成流淌着字符的河。

1.2标准流的引入

在C语言中我们如何对针对⽂件、画⾯、键盘等的数据输⼊输出操作呢?其实C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。那为什么我们使用scanf和printf函数并没有直观的感觉到呢?这时候就要引入标准流。

1.3 标准流

C语⾔程序在启动的时候,默认打开了3个流:
stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出
流中。
stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为⽂件指针
 
2   ⽂件指针(⽂件类型指针)

2.1  概念:

C语⾔中,我们就是通过 FILE* 的⽂件指针来维护流的各种操作的。我们在对文件进行操作时必须使用FILE*指针。 每个被使⽤的⽂件都在内存开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名 FILE。不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。

2.2 创建⼀个FILE*的指针变量

int main()

{
FILE* pf;//⽂件指针变量

return 0

}

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

3    ⽂件的打开和关闭
3.1   ⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。所以我们使用文件的固定步骤打开⽂件、文件操作、关闭⽂件。这些过程需要FILE*的指针变量来连接,其实我们在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也就相当于建⽴了指针和⽂件的关系。而ANSI C 规定使⽤ fopen 函数来打开⽂件, fclose函数来关闭⽂件。

3.2使用文件的固定步骤

 fopen 函数原型:

 fclose函数原型:

3.3   文件的打开模式

其中常用的只要几个。

1

三    ⽂件的顺序读写

下面我们来介绍几个顺序读写函数,我们可以利用这几个顺序读写函数在结和文件的打开模式对文件进行操作。

顺序读写函数:

1   fgect函数

1.1  这是一个字符输入函数个,适用于所有输入流。

示例:

这里我们运用"r"只读的方式打开文件,这里我们是进行字符的读取,所以我们应在相应文件中放上内容  再看相应文件中的内容:

再看运行结果:

注意在读取字符时它会从第一个字符的位置开始读取,当每次读取完成后,光标会往后移动一位,利用这一特性,再利用循环进行读取,这样我们就可以达到像读取字符串一样,当我们想读取的个数比读取文件中的个数多会发生什么呢?这时候多余的会打印出错误信息(这里我就不举例了,感兴趣的可以自己试一试。特别注意fgetc在遇到空格时会选择跳过

 1.2    这个函数适用于使用输入流,那意味着对于标准流也有用。

这里我们先输入一个字符便可以打印出相应的字符

2   fputc函数

2.1 这是一个字符输出函数,适用于所有输出流。

示例:

现在我们打开文件观察其运行结果:

这里我们发现文件中已经有了相应的字符,但是我们·发现文件中的字符全部都在一行这是为什么呢?其实fputc函数也能识别”\0"只要其识别到”\0"结束标识符时才会换行。那这里有一个问题很值得我们思考,上面的fgect函数适用于使用输入流,是一个字符输入函数,而fputc函数这个函数适用于使用输出流,是一个字符输出函数。那么这两个函数是否呢结和使用呢?

fgect函数和fputc函数结和使用:

这里我们发现fgect函数和fputc函数结和使用结果是不行的,因为"w"模式是写入模式,会清空文件内容,在写入之后,在进行读取操作不会得到任何内容。

2.2 这个函数适用于使用输出流,那意味着对于标准流也有用。

3   fgets函数

这是一个文本行输入函数,适用于所有输入流。(文本行即能对一行操作)

这个函数有三个参数分别是存放读取字符串的地址、读取的字符个数、文件指针。

示例:

我们看一看文件中都内容:

 4  fputs函数

这是一个文本行输出函数,适用于所有输出流。(文本行即能对一行操作)

这个函数有两个参数分别是:字符串地址和文件指针

示例1:

结果:

示例2:

结果:
我们来比较一下上面两个代码运行结果我们观察看到输入的字符相同只是一个有换行一个没有,对应的结果便是有换行的结果在文件在分为两行没有换行的则在一行,所以 fputs函数是会识别换行符"\n"要想结果换行使用fputs函数就必须包含换行符。
5   fscanf函数

这是一个格式化输⼊函数函数,适用于所有输入流(格式化即特定的格式可以包含多个类型)

  我们发现这个函数的原型有些神奇,他的参数里面居然有个省略号!也就是说,它支持传入的参数个数是无限制的!要想熟练使用fscanf函数就得仿造scanf函数它们只相差一个参数fscanf函数比scanf函数多了一个文件指针。

示例:

文件内容:

运行结果:

6  fprintf函数

这是一个格式化输出函数,适用于所有输出流(格式化即特定的格式可以包含多个类型)

它的使用可以类比于printf函数比printf函数多了一个参数( 文件指针)

示例:

7   fread函数

这是一个⼆进制输⼊函数,适用于文件输入流。

这个函数传入的参数就相对来说复杂了一些:分别是存放字符串的地址、数据的字节大小、数据的数量、文件指针。

示例:

8 fwrite函数

 这是一个⼆进制输出函数,适用于文件输出流。

示例:

四    ⽂件的随机读写

1  fseek函数
这个函数可以根据⽂件指针的位置和偏移量来定位⽂件指针(⽂件内容的光标)
int fseek ( FILE * stream, long int offset, int origin );

   第一个参数就是文件指针,没什么好说的,通过上前面的学习我们发现这种文件操作函数基本都要输入文件指针。

  第二个参数是偏移量参数,可以为正数,也可以为负数。

  第三个参数是起始位置

C语言为我们提供了 三个起始位置:
  • 文件头 SEEK_SET 0
  • 当前位置 SEEK_CUR 1
  • 文件尾 SEEK_END 2

2    ftell函数

 这个函数可以返回文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

我们直接传文件指针就行,他会返回光标位置相较于文本最开始的偏移量 

rewind函数

这个函数可以让文件指针的位置回到文件的起始位置。

void rewind ( FILE * stream );

示例:

五    ⽂件读取结束的判定  

1⽂本⽂件读取是否结束/⼆进制⽂件的读取结束判断

我们都知道,EOF是文件结束的标志,那么feof呢?

  牢记:在⽂件读取过程中,不能⽤ feof 函数的返回值直接来判断⽂件的是否结束。 feof 的作⽤是:当⽂件读取结束的时候,判断读取结束的原因是否是:遇到⽂件尾结束。
⽂本⽂件读取是否结束:
判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
•fgetc 判断是否为 EOF .
•fgets 判断返回值是否为 NULL .
⼆进制⽂件的读取结束判断:
判断返回值是否⼩于实际要读的个数。
fread判断返回值是否⼩于实际要读的个数。

⽂本⽂件的例⼦:

3   ⼆进制⽂件的例⼦:

运行结果:

    ⽂件缓冲区

缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。在C语言文件操作时,其实我们读取文件内容和输入内容到文件时,并不是直接对其进行操作的,而是通过文件缓冲区操作。那为什么会有⽂件缓冲区呢?其目的是为了提高编程效率假如没有⽂件缓冲区,这是我们要对一个字符串操作时如果没有⽂件缓冲区,我们就要不断对每个字符重复的进行操作,如果有了⽂件缓冲区我们把像输入的字符一个一个先放入缓冲区,等到积攒到了一定的数量,超过缓冲区范围,再把缓冲区的字符一次性放到硬盘中,这样就能减少系统的运行压力。记住缓冲区的⼤⼩根据C编译系统决定的。

本篇文章就到此结束,欢迎大家订阅我的专栏,欢迎大家指正,希望有所能帮到读者更好了解⽂件操作相关知识 ,觉得有帮助的还请三联支持一下~后续会不断更新C/C++相关知识,我们下期再见。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何构建一个可扩展、全球可访问的 GenAI 架构?

你有没有尝试过使用人工智能生成图像? 如果你尝试过,你就会知道,一张好的图像的关键在于一个详细具体的提示。 我不擅长这种详细的视觉提示,所以我依赖大型语言模型来生成详细的提示,然后使用这些提示来生成出色的图像…

Python知识点精汇:列表篇精汇!

目录 一、列表是什么 二、列表长什么样 三、列表的基本操作 (1)访问元素 (2)列表删除 (3)增加元素 (4)修改元素 四、结合一些函数的用法 (1)最大值、…

基于WEB的房屋出租管理系统设计

摘 要 在当今社会的蓬勃发展的现状下,网络与我们的生活息息相关。工作、生活、休闲我们都利用着网络带给我们 的便捷,网络的发展提供了很多工作机会,众多的人们在不同的城市寻找着合适的工作机会,在此的第一步就是寻 找一个合适自…

【算法day4】链表:应用拓展与快慢指针

题目引用 两两交换链表节点删除链表的倒数第n个节点链表相交环形链表 1.两两交换链表节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换&am…

电商项目高级篇06-缓存

电商项目高级篇06-缓存 1、docker下启动redis2、项目整合redis3、redis改造三级分类业务 缓存 流程图: data cache.load(id);//从缓存加载数据 If(data null){ data db.load(id);//从数据库加载数据 cache.put(id,data);//保存到 cache 中 } return data;在我们…

osg、osgearth源码编译(二)

如果比较懒,也可以不看这篇文章,网上应该有很多编译好的库。也可以找我要。 本人还是建议学会编译,因为其他人电脑上编译好的,可能在你的电脑环境上,出现这样那样奇怪的问题,所以,最好还是自己能…

Kubernetes 01

MESOS:APACHE 分布式资源管理框架 2019-5 Twitter退出,转向使用Kubernetes Docker Swarm 与Docker绑定,只对Docker的资源管理框架,阿里云默认Kubernetes Kubernetes:Google 10年的容器化基础框架,borg…

中科院一区算法KO-K均值优化算法(K-means Optimizer)-附Matlab免费代码

首先,使用K-means算法在每次迭代中建立聚类区域的形心向量,然后KO提出两种移动策略,以在开发和探索能力之间建立平衡。每次迭代中探索或开发的移动策略的决定取决于一个参数,该参数将被设计为识别每个搜索代理是否在访问的区域中过…

算法复杂度

数据结构 数据结构(DataStructure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希等 算法…

用Python做数据分析环境搭建及工具使用(Jupyter)

目录 一、Anaconda下载、安装 二、Jupyter 打开 三、Jupyter 常用快捷键 3.1 创建控制台 3.2 命令行模式下的快捷键 3.3 运行模式下快捷键 3.4 代码模式和笔记模式 3.5 编写Python代码 一、Anaconda下载、安装 【最新最全】Anaconda安装python环境_anaconda配置python…

【R库包安装】R库包安装总结:conda、CRAN等

【R库包安装】R studio 安装rgdal库/BPST库 R studio 安装rgdal库解决方法 R studio 安装BPST库(github)解决方法方法1:使用devtools安装方法2:下载安装包直接在Rstudio中安装 参考 基础 R 库包的安装可参见另一博客-【R库包安装】…

前海湾地铁的腾通数码大厦背后的临时免费停车点探寻

临时免费停车点:前海湾地铁的腾通数码大厦背后的桂湾大街,目前看不仅整条桂湾大街停了​车,而且还有工地餐点。可能是这个区域还是半工地状态,故暂时还不会有​罚单的情况出现。 中建三局腾讯数码大厦项目部A栋 广东省深圳市南山…

Vue3在PC端接入萤石云监控

参考文档&#xff1a;文档概述 萤石开放平台API文档 1.安装依赖 npm i ezuikit-js 2.封装组件 src/components/PlayerVideo/index.vue <template><div id"video-container" style"width: 100%;"></div> </template> <scrip…

YOLO系列论文综述(从YOLOv1到YOLOv11)【第9篇:YOLOv7——跨尺度特征融合】

YOLOv7 1 摘要2 网络架构3 改进点4 和YOLOv4及YOLOR的对比 YOLO系列博文&#xff1a; 【第1篇&#xff1a;概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇&#xff1a;YOLO系列论文、代码和主要优缺点汇总】【第3篇&#xff1a;YOLOv1——YOLO的开山之作】【第…

Redis3——线程模型与数据结构

Redis3——线程模型与数据结构 本文讲述了redis的单线程模型和IO多线程工作原理&#xff0c;以及几个主要数据结构的实现。 1. Redis的单线程模型 redis6.0之前&#xff0c;一个redis进程只有一个io线程&#xff0c;通过reactor模式可以连接大量客户端&#xff1b;redis6.0为了…

【C++】STL容器中的比较函数对象

目录 set、map容器 priority_queue容器 在STL中涉及到以某种规则排序的容器都需要比较函数对象&#xff0c;比如&#xff1a;set、map、priority_queue这些容器内部都是依赖比较函数对象以某种规则存储数据的。STL容器中的比较函数对象可以是&#xff1a;函数指针、仿函数(函…

领养我的宠物:SpringBoot开发指南

第2章 开发环境与技术 本章节对开发宠物领养系统需要搭建的开发环境&#xff0c;还有宠物领养系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff0c;不仅仅是创造者感觉C语言在编…

南京仁品耳鼻喉专科医院:12月启动公益义诊月

专业医疗资源送至“家门口”&#xff01;南京仁品耳鼻喉专科医院启动公益义诊月 随着2024年即将步入尾声&#xff0c;南京仁品耳鼻喉医院为回馈社会&#xff0c;提升公众健康福祉&#xff0c;将于12月隆重推出“三甲专家公益义诊月”活动。此次活动旨在通过汇聚众多耳鼻喉领域…

centos8:Could not resolve host: mirrorlist.centos.org

【1】错误消息&#xff1a; [rootcentos211 redis-7.0.15]# yum update CentOS Stream 8 - AppStream …

会议直击|美格智能亮相2024紫光展锐全球合作伙伴大会,融合5G+AI共拓全球市场

11月26日&#xff0c;2024紫光展锐全球合作伙伴大会在上海举办&#xff0c;作为紫光展锐年度盛会&#xff0c;吸引来自全球的众多合作伙伴和行业专家、学者共同参与。美格智能与紫光展锐竭诚合作多年&#xff0c;共同面向5G、AI和卫星通信为代表的前沿科技&#xff0c;聚焦技术…