前言
本篇文章主要介绍了文本文件和二进制文件,文件读取结束的判定,如何使用函数进行文件的拷贝,文件缓冲区的相关知识。
以及具有保存功能的八功能通讯录的源码。
文章目录
- 前言
- 1.文本文件和二进制文件
- 2.文件读取结束的判定
- 2.1 被错误使用的feof
- 2.2 ferror与feof
- 3 如何用函数进行文件的拷贝
- 4.文件缓冲区
- 5.文件操作改造通讯录(具有保存功能)
1.文本文件和二进制文件
据数据的组织形式,数据文件被称为文本文件或者二进制文件。
①数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
②如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件
用fwrite函数写一个二进制的文本。
#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是可以看懂二进制文件的!
2.文件读取结束的判定
2.1 被错误使用的feof
牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束
-
文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL . -
二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。
补充说明:fread要求读取count个大小为size字节的数据,如果真的读取到count个数据,函数返回count。如果没有读取到count个数据,返回的是真实的读取到的完整的数据个数。
2.2 ferror与feof
ferror: 在文件读取结束后,用来判断文件是否因为读取过程中遇到错误而结束!
feof:在文件读取结束后,用来判断文件是否因为读取过程中遇到文件结束标志而结束!
3 如何用函数进行文件的拷贝
int main()
{
FILE* pfread = fopen("data1.txt", "r");
if (pfread == NULL)
{
perror("fopen");
return 1;
}
FILE* pfwrite = fopen("data2.txt", "w");
if (pfwrite == NULL)
{
perror("fopen");
fclose(pfread);//如果第二个文件打开失败,那么第一个文件打开就没有意义,所以关掉第一个文件
pfread = NULL;
return 1;
}
//拷贝数据
int ch = 0;
while ((ch = fgetc(pfread)) != EOF)
{
fputc(ch, pfwrite);
}
fclose(pfread);
pfread = NULL;
fclose(pfwrite);
pfwrite = NULL;
return 0;
}
4.文件缓冲区
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题。
5.文件操作改造通讯录(具有保存功能)
链接: 八通能通讯录
这是我们前面写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。
我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
代码在我的gitee中。
链接: 保存功能八功能通讯录