在我们的学习中,文件操作是被我们忽略,但用的时候又记忆模糊的内容,今天我带领大家来学习一下。
我之前也写过一篇,不过没这么详细,指路->《》,可查漏补缺。
我们在程序中怎么把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。
这就涉及到了的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据
库等方式。
使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
磁盘上的文件是文件。
但是在程序设计中,我们一般谈的文件有两种:、(从文件功能的角度来分类的)。
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境
后缀为.exe)。
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,
或者输出内容的文件。
本篇讨论的是。
以前我们学习C语言所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理
的就是磁盘上文件。
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如: c:code est.txt
为了方便起见,文件标识常被称为文件名。
缓冲文件系统中,关键的概念是“”,简称“”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名
字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统
声明的,取名FILE.
例如,VS2022编译环境提供的 stdio.h 头文件中有以下的文件类型申明:
不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,
使用者不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
下面我们可以创建一个FILE*的指针变量:
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变
量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联
的文件。
比如:
打开方式如下:
实例代码:
下面我将举例带你们体会怎么运用:
scanf--从键盘上读取格式化数据 适用于:stdin
printf--把数据(输出)到屏幕上 适用于:stout
fscanf--针对所有输入流的格式化的输入函数 适用于:stdin 打开的文件
fprintf--针对所有输出流的格式化的输出函数 适用于:stout 打开的文件
sscanf--从一个字符串中,还原出一个格式化的数据
sprintf--把格式化的数据,存放在(转换成)一个字符串
根据数据的组织形式,数据文件被称为或者。
一个数据在内存中存储,如果是字符则一律以ASCII形式存储,数值型数据可以用ASCII形势存储也可以用二进制形式存储。
比如:整数10000,
如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而
二进制形式输出,则在磁盘上只占4个字节。
先在解决方案中右击添加test.txt文件
右击test.txt文件
选择 二进制编辑器 确定即可
结果:
原理: ,故看起来相反
:在文件读取过程中,。
而是用于当文件读取结束的时候,判断是读取失败(返回0)结束,还是遇到文件尾结束(返回非0值)。
ferror:返回值为,
文本文件读取是否结束,判断返回值是否为 ( fgetc ),或者 ( fgets )
例如:
fgetc 判断是否为 .
如果成功,则返回读取的字符(提升为int值)。
返回类型是int,以适应表示失败的特殊值EOF:
如果位置指示符在文件末尾,该函数返回EOF并设置stream的EOF指示符(feof)。
c. 如果发生其他读取错误,该函数也返回EOF,但设置其错误指示器(ferror)。
fgets 判断返回值是否为 .
如果成功,函数返回str。
如果在试图读取字符时遇到了文件结束符,则设置eof (feof)。
如果这是在读取任何字符之前发生的,则返回的指针是null指针(str的内容保持不变)。
如果发生读错误,则设置错误指示器(ferror),并返回null指针(但str指向的内容可能已经改变)。
二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。
文本文件举例:
二进制文件举例:
ANSIC 标准采用“”处理的数据文件的,
所谓。
从内存向磁盘输出数据会先送到内存中的缓冲区,缓冲区后才一起送到磁盘上。
如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓
冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。
缓冲区的大小根据决定的。
一个多月没有写博客记录了,因为实在是写得太慢了,以后会继续坚持的!!!
希望和大家一起进步!!!
点个赞再走吧~~~🐧 🐧 🐧