文件操作(1)

 为什么使⽤⽂件?

如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。

什么是⽂件?

磁盘上的⽂件是⽂件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类的)

 

程序⽂件:

程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)。
其实我们可以理解程序文件就是我们写代码的文件(其可以运行)。源程序文件是还没经历编译和链接时的最初始的文件,而目标文件和可执行程序是源程序文件在编译,链接时产生的文件。

 

数据⽂件

⽂件的内容不是程序,不可以运行,该文件只能被读写数据。⽐如程序运⾏需要从中读取数据的⽂
件,或者输出内容的⽂件,(其并不会被运行,只是拿来读写)

在以前各章所处理据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到显⽰器上。 其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件。

而我们今天本篇文件操作文章讨论的对象就是数据⽂件,并不是程序文件.接下来讲的都是跟数据文件有关的知识点。

 文件名 

⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀 。
例如: c:\code\mycode\test.txt
这里的c:\code\mycode\就是文件路径,test就是文件名主干,.txt就是文件后缀。

文件中不能包含这些字符: * ? " < > | 
文件的后缀名决定了一个文件的默认打开方式
文件路径指的是从盘符到该文件所经历的路径中各符号名的集合
为了⽅便起⻅,⽂件标识常被称为⽂件名。文件名都是唯一的,绝不可能会有相同的。



 

二进制文件和文本文件

根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。

 二进制文件

数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件。二进制文件里储存的都是数据在内存中存储的原形式。如下是二进制文件的储存情况,存的是10000在内存中的存储原形式.

其在内存中的存储原形式为10 27 00 00  ,所以直接将其不加转换的存入到二进制文件中,(都还是十六进制形式)

对于最开始的00000000,我们也不清楚,可能是编码什么的,跟我们存入的数据没关系,没必要去理解。

要打开二进制文件并使其正常显示出其数据,我们就必须用二进制编译器,其它编译器都会显示出乱码(我们看不懂)

 文本文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
这里说定义大家也搞不懂,那这里就带大家看下二进制文件和文本文件的区别应该就能懂了。
数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽⼆进制形式输出,则在磁盘上只占4个字节(VS2019测试)。

 

 如上图,文本文件就是将其数据转换为ascall码形式的数据再储存在文本文件中。这样每个字符都要转换为ascall码值,所以就由四个字节变为5个字节去存储在文本文件中。

当我们打开文本文件时,显示出的依然是我们原来的值。举个例子,比如我们将400000存入文本文件时,我们打开文本文件后显示出来的是400000(原数据),并不是地址形式的数据。(大部分编译器都能打开并正常显示出数据)

 文件的打开和关闭

 流和标准流

流 

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,我们程序员就是个写代码,不可能了解所有的不同设备之间的传递,这可太麻烦了,所以为了⽅便程序员对各种设备进⾏⽅便的操作,我们创造出了流这个东西。
c语言底层规定了流到不同设备之间的互相传输,不需要我们去进行操作,底层会自动帮我们去操作,所以我们只需要将数据传到流或者从流中提到数据就能实现整个过程。它跟个中转站一样。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流当中转站操作的。

 

所以我们想要读取数据或者输入数据从某外部设备中,都是必须要打开对应的流才能操作。

(该图片转载) 

流是有明确的方向性的,所以分为两种,要么是输入流(从外部设备到内存),要么是输出流 (从内存向外部设备)。

 标准流

 那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流,却依然能执行(如scanf,printf没有打开流却依然能执行这些操作)

那是因为C语⾔程序在启动的时候,默认打开了3个流:
stdin(指向标准输入流) - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
stdout (指向标准输出流)- 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出 流中。
stderr (指向标准错误流)- 标准错误流,⼤多数环境中输出到显⽰器界⾯。perror函数就是将错误信息输出到标准错误流中。(其流是输出错误信息到显示器上)
所以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类型为结构体(用了typedef将其重命名,其为结构体类型)

不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。
每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构体并填充其中的信
息,使⽤者不必关⼼细节。
文件信息区其实就是流,所以并不是只有文件才有对应的文件信息区。屏幕,键盘等都有对应的文件信息区(也就是流)。
流的类型就都为FILE类型。
对于stderr,stdin,stdout它们其实就是文件信息区,在程序开始后就自动在内存里开辟FILE类型的空间,它们对应着键盘,显示器,作为中转站去使用。
⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加⽅便。
下⾯我们可以创建⼀个FILE*的指针变量:
 FILE* pf;//⽂件指针变量
定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该⽂件。(这证明了其文件信息区为中转站,而流也为中转站,更能证明流就是文件信息区。)也就是说,通过⽂件指针变量能够间接找到与
它关联的⽂件。

文件的打开和关闭 

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。
在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。
ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

fopen函数

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

 第一个参数是文件名,第二个参数是打开方式。最终该函数会返回其文件的文件信息区的地址。

fopen第一个参数

对于该文件名,有相对路径和绝对路径。

相对路径:如第一个参数直接写"data,txt",代表着该文件与你的这个项目文件在同一个文件夹里(同一个目录里)。

当然还可以用.和..去修饰相对路径。 如”./../../data.txt“表示data.txt在该项目文件的上上个目录中。

 绝对路径:

就是文件名中直接写根本的路径,根本路径我们需要在属性中看.

如图上中的文件在桌面上,其属性中的位置就是其桌面的位置,将其我们的目标文件名改为“c:\users\zhu xuan\Desktop\data.txt”就代表这是在桌面上的data.txt文件,并且由于\为转义字符,所以在代码中需要改为\\才能不影响结果。如“c:\\users\\zhu xuan\\Desktop\\data.txt”。

fopen第二个参数

有以下的打开方式: 

 现在浅谈一下“r”“w”“a”。

“r”:如果不存在该文本文件,则返回一个NULL指针,且系统会出错(但程序不会崩溃,依旧运行,我们可以用perror去打印出其错误)。

如果存在该文本文件,则打开该文本文件,且只能对该文件的数据进行读取使用(不能输入数据对该文件进行修改)。

”w“:如果不存在该文本文件,则建立一个新的文本文件。

如果存在该文本文件,则打开该文件且格式化该文件(将该文件内容清除),且只能对该文件的数据进行输入数据(不能读取该文件)。

”a“:如果不存在该文本文件,则建立一个新的文本文件。

如果存在该文本文件,则打开该文件(不会格式化该文件),保留原来的内容并继续追加数据输入到文件中(不能读取该文件)

 其总共有12种打开方式,这里我们只讲三种(对于有r字符的打卡方式,都是不存在该文件则返回NULL,其他打开方式都是再建立一个文件)。

对于其fopen打开方式的更多细节内容,我推荐一篇文章,这里讲的更仔细。

【C 语言】文件操作 ( fopen 文件打开方式详解 )-CSDN博客 

这篇文章讲了其中七种的打开方式,讲的很详细了,看懂了这七种其他的自然手到擒来。还讲了个rw+打开方式,rw+用到的很少无需关注。

fclose函数 

这个就很简单了,只需要将该文件的文件信息区的地址填入到fclose括号里面,就能销毁掉该文件的文件信息区(也就是关闭文件)

总结

所以这就是我们的c语言文件读写的第一部分(这是我在一月份c语言时期写的存稿,所以书写可能没有现在美观,还请见谅)。 还希望各位大佬们能给个三连,点点关注,点点赞,发发评论呀,感谢各位大佬~❤️❤️💕💕🥳🎉🎉🎉

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

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

相关文章

再谈C语言——理解指针(四)

assert断⾔ assert.h 头⽂件定义了宏 assert() &#xff0c;⽤于在运⾏时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终⽌运⾏。这个宏常常被称为“断⾔”。 assert(p ! NULL); 上⾯代码在程序运⾏到这⼀⾏语句时&#xff0c;验证变量 p 是否等于 NULL 。…

JavaScript 数学对象 Math

Math对象其实就是数学对象&#xff0c;它给我们提供了各种各样的数学功能。 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</title> </head><body><script type"text/javascript"&g…

linux的“>”和“>>”

在Linux中&#xff0c;>和>>都是用于文件重定向的操作符&#xff0c;它们用于将命令的输出发送到文件中。 > 用于创建一个新文件或覆盖现有文件的内容。当你执行一个如 command > file.txt 的命令时&#xff0c;如果 file.txt 文件存在&#xff0c;它的内容将被…

【uniapp】引入uni-ui组件库

&#xff08;1&#xff09;新建项目的时候选择 uni-ui项目 &#xff08;2&#xff09;已经创建好的项目去官网单独安装 跳转单独安装组件 https://uniapp.dcloud.net.cn/component/uniui/quickstart.html#%E9%80%9A%E8%BF%87-uni-modules-%E5%8D%95%E7%8B%AC%E5%AE%89%E8%A3%8…

YOLOv9训练损失、精度、mAP绘图功能 | 支持多结果对比,多结果绘在一个图片(消融实验、科研必备)

一、本文介绍 本文给大家带来的是YOLOv9系列的绘图功能&#xff0c;我将向大家介绍YOLO系列的绘图功能。我们在进行实验时&#xff0c;经常需要比较多个结果&#xff0c;针对这一问题&#xff0c;我写了点代码来解决这个问题&#xff0c;它可以根据训练结果绘制损失(loss)和mA…

VBA技术资料MF144:将PDF首页作为对象插入工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【C++】如何用C++写一个日期计算器

目录 前言 代码的布局 设计数据 方法声明 方法的实现 获取某年某月的天数 *全缺省的构造函数 * 拷贝构造函数 *赋值运算符重载 *析构函数 日期天数 日期天数 日期-天数 日期-天数 前置 后置 后置-- 前置-- 实现比较大小运算符重载思路 >运算符重载 运算…

盲人餐厅点餐:科技之光照亮餐桌上的美食之旅

在现代社会&#xff0c;餐厅不仅是满足口腹之欲的场所&#xff0c;更是一个社交、放松的重要空间。然而&#xff0c;对于视障人士而言&#xff0c;盲人餐厅点餐这一日常行为&#xff0c;却往往伴随着诸多不便与挑战。幸运的是&#xff0c;科技的革新正为这一群体带来前所未有的…

递归神经网络(RNN)在AI去衣技术中的深度应用

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;图像处理和计算机视觉领域不断取得新的突破。其中&#xff0c;AI去衣技术作为一个具有挑战性的研究方向&#xff0c;引起了广大研究者和公众的关注。递归神经网络&#xff08;RNN&#xff09;作为深度学习的…

【linux】编译器使用

目录 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&#xff09; 2. .o 文件和库的链接方式 a. 链接方式 b. 动态库 和 静态库 优缺点对比 c. debug 版本 和 release 版本 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&…

【第19章】spring-i8n

文章目录 前言一、准备二、Java国际化1.测试类2.测试结果 三、Spring国际化1.配置文件2.测试类3.测试结果4.占位符4.1 准备4.2 测试类4.3 测试结果 总结 前言 在Spring中实现国际化Internationalization&#xff08;i18n&#xff09;其实就是完成语言的切换&#xff0c;类似于…

4.SpringCloud基础项目搭建利用RestTemplate实现远程调用

简单的微服务架构 父pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…

短信视频提取批量工具,免COOKIE,博主视频下载抓取,爬虫

痛点&#xff1a;关于看了好多市面的软件&#xff0c;必须要先登录自己的Dy号才能 然后找到自己的COOKIE 放入软件才可以继续搜索&#xff0c;并且无法避免长时间使用 会导致无法正常显示页面的问题。 有没有一种方法 直接可以使用软件&#xff0c;不用设置的COOKIE的方法呢 …

Linux驱动开发:掌握SPI通信机制

目录标题 1、SPI简介2、SPI通信机制3、Linux内核中的SPI支持4、SPI核心API5、SPI控制器驱动6、SPI设备驱动 7、编写SPI设备驱动8、调试SPI驱动 在Linux驱动开发中&#xff0c;串行外设接口(SPI)是一种常见的高速全双工通信协议&#xff0c;用于连接处理器和各种外设。本文将深入…

会声会影滤镜怎么用 会声会影滤镜效果怎么调 会声会影视频制作教程

在进行视频剪辑时&#xff0c;合理地运用滤镜效果可以提升视频的观赏性&#xff0c;使你的作品更加出彩。这篇文章便一起来学习会声会影滤镜怎么用&#xff0c;会声会影滤镜效果怎么调。 一、会声会影滤镜怎么用 使用会声会影的滤镜效果非常简单&#xff0c;以下是具体的操作…

Rust腐蚀服务器定制地图开服

Rust腐蚀服务器定制地图开服 大家好我是艾西一个做服务器租用的网络架构师。Rust腐蚀这个游戏有很多的插件mod作者&#xff0c;在地图制作这一块也是一样&#xff0c;有些好玩的地图可能大家在map网站找到了但是不知道怎么操作设置那么今天艾西给大家说下特定定制地图怎么弄。…

Penpad获Gate Labs以及Scroll联创Sandy的投资

近期&#xff0c;Scroll上的LaunchPad &聚合收益平台Penpad迎来了重磅利好&#xff0c;该平台在前不久获得了来自于Gate Las的融资&#xff0c;在此后其又获得了Scroll联合创始人Sandy的融资&#xff0c;这也让Penpad平台成为了近期Scroll生态中最值得关注的项目之一。 事实…

《生成式AI导论》学习笔记

1.课程定位 2.什么是生成式人工智慧&#xff1f; 3. 今日的生成式人工智慧厉害在哪里&#xff1f; 4.训练不了人工智慧&#xff1f;那我训练自己 5.训练不了人工智慧&#xff1f;你可以训练你自己&#xff08;中&#xff09;——拆解问题使用工具 6.大语言模型修炼史——第一阶…

毕业设计注意事项(2024届更新中)

1.开题 根据学院发的开题报告模板完成&#xff0c;其中大纲部分可参考资料 2.毕设 根据资料中的毕设评价标准&#xff0c;对照工作量 3.论文 3.1 格式问题 非常重要&#xff0c;认真对比资料中我发的模板&#xff0c;格式有问题&#xff0c;答辩输一半&#xff01; 以word…

从零开始的软件测试学习之旅(一)理论知识篇

软件测试学习理论知识 一.软件测试分类二.什么是软件测试?软件测试选择最为经典的几个模型一.瀑布模型 :将软件生命周期进行划分二.快速原型模型三.敏捷开发 三.软件测试流程一.软件测试模型测试流程: 四.软件测试分类项目环境测试与代码 一.软件测试分类 1.按开发规模 小型…