文章目录
- 七、 C语言入门——文件操作
- 文件操作
-
- 1. 文件打开:fopen函数
- 2.文件关闭:fclose
- 3.文件读取
七、 C语言入门——文件操作 ??我们前面的所有程序都是暂时的,把程序一关,什么都不会留下来,打开又是从头再来,当我们希望能保留一下处理的数据,或者对现存在的数据进行处理,我们就需要文件操作了。
??我们主要讨论如何对数据文件进行操作。
??像什么文本文件,都是存储在磁盘上的,这些数据掉电不丢失,我们把程序处理的数据放在这里,就能实现长期保留了。
??文件分成2类:ASCII文件和二进制文件。ASCII文件就是所有字符以ASCII形式存储,二进制文件就是原汁原味的(毕竟计算机是二进制的)如存放1000这个数,ASCII要存1和4个0,二进制则存放001111101000,它们的所占大小区别很大。
??文件缓冲区:系统为每一个正在使用的文件开辟的缓冲区,这个缓冲区在内存,当我们从磁盘读取一定的数据是,数据先从磁盘到缓冲区,缓冲区满后再送程序数据区,给程序使用,对磁盘文件的写操作也是如此。
??每个被使用的文件都在内存中有一个存放对应文件信息的区域,叫文件信息区,这些信息放在一个结构体中,这个结构体是系统定义和命名的,就是FILE,其定义包含在头文件stdio中。这个结构体通过前面的typedef重名名过,所以可以直接用FILE不用加struct。
??FILE *fp——我们定义了一个FILE类型的指针fp。由于fp指向一个存放打开文件信息的结构体,所以我们可以通过fp访问对应的文件。
??这样的fp我们叫做文件指针。
??关于文件操作,还有一些概念。
??文件一定要打开才能操作,这个应该没什么疑问吧。
??文件打开了一定要关闭,防止其被程序误用,要有始有终。
文件操作 1. 文件打开:fopen函数 fopen(文件名,打开方式);
??fopen函数返回一个指向打开文件的文件指针,通过这个指针我们可以访问我们打开的文件的内容。如fopen(“k”,“r”);——以只读的方式打开名为k的文件。
??我们用一个FILE类型的指针fp来接收:fp = fopen(“k”,“r”);
打开方式:
r | 只读(文本文件),只能读取不能写入,文件不存在就出错。 |
---|---|
w | 只写(文本文件),注意是全部格式化写入,文件不存在就新建文件。 |
a | 追加,向文本文件尾添加数据,文件不存在就出错。 |
rb | 只读(二进制文件),文件不存在就出错 |
wb | 只写(二进制文件),文件不存在就新建文件 |
ab | 追加(二进制文件),文件不存在就出错 |
r+ | 读写,能读能写(文本文件),文件不存在就出错 |
w+ | 读写,能读能写(文本文件),文件不存在就新建文件 |
a+ | 读写(文本文件)文件不存在就出错 |
rb+ | 读写(二进制文件),文件不存在就出错 |
wb+ | 读写(二进制文件),文件不存在就新建文件 |
ab+ | 读写(二进制文件),文件不存在就出错 |
??a方式,在文件末尾追加数据,不会删除原来的。
??用a+方式,能读能写,但文件读写的位置是从最后开始的。
??如果文件打开失败,返回空指针。
常用的打开格式:
if(!(fp = fopen("name","r")))
{
printf("Error\a\n");
exit(0);
}
??exit(0)是使程序停止运行。
2.文件关闭:fclose ??fclose(fp)——关闭fp指向的文件。成功返回0,不成功返回EOF(-1)
??文件打开后,我们可以对文件操作了
3.文件读取 fgetc(fp)——从fp指向的文件中读一个字符,成功返回该字符,失败返回EOF
fputc(ch,fp)——把ch字符写到fp中的文件中去,成功返回写入字符,失败返回EOF
fgets(str,n,fp)——从fp指向的文件中读长度为n-1的字符放在str数组中,成功返回str地址,失败返回空指针
fputs(str,fp)——把str指向的字符串写入fp指向的文件,成功返回0,不成功返回非0
??由于字符串有结束标志,所以n长度字符串有效的只有n-1,
??我们在对文件内部操作时,有一个就向word的光标一样的东西,表示当前要操作的地方, 我们写入,删除时,光标就跟进移动,同时执行操作,这个东西在文件中就是文件读写位置标记,表示当有操作来的时候,对文件的哪里进行操作,新文件就在开头,a方式打开的文件就在文件尾,r方式打开的文件也在文件头。
- 格式化文件读写
fprintf(文件指针,格式化字符串,输出列表);
fscanf(文件指针,格式化字符串,输入列表);
??如fprintf(fp,“%d,%lf”,a,b);把a,b写入fp指向文件中,和输出到屏幕中是一样的用法和效果,只不过这个是输出到文件中。
??格式化读写输入输出时都需要将ASCII转换成二进制形式,不适合频繁交换。
- 二进制读写
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
??这两个函数可以实现一个数据块的写入和读出,适合数组,结构体这种大数据的读写。
buffer——读出的内容存放的地方或者写入这个地方的内容,是个地址。
Size——要读写的一个元素的字节数
Count——读写的个数
fp——文件指针
??注意:这两个函数只能以二进制方式读写,所以文件也要用二进制的形式打开。
- 文件的随机读写:
??随机读写是指随意读写文件的任何位置信息,这就要用到前面说过的文件位置标记了。我们可以人为的移动文件标记,从而实现对任何位置的操作。
rewind(fp)——使文件标记返回开头
fseek(fp,位移量,起始点)——改变文件标记,表示将文件标记移动到距起始点多少偏移量的位置去。
??起始点:0表示从开头,1表示当前,2表示文件末尾。
??位移量是以起始点为基点,向前移动的字节数,其类型应该是long,向后移就是负值。
ftell(fp)——获得文件标志当前位置:返回相对于开头的偏移量,出错返回-1
- 文件结束:
feof(fp)——判断fp指向的文件是否结束,即文件读写位置是否为文件尾,结束返回1,没结束返回0
- 【入门教程|C语言总结项目和入门——文件操作】文件出错检测:
ferror(fp)——对于任何一次读写操作,除了看返回值外,还可以调用这个函数查看是否出错,返回0表示没有出错,非0表示出错。
??注意的是,每次新的读写都会改变ferror的返回值,要及时访问。
clearerr(fp)——ferror如果检测出出错,就一直保留非0值,直到下一次更新,我们也可以给它手动复位,clearerr(fp)就负责复位ferror。
??文件操作的程序例子单拿出来也写不出啥,下一章会做一个C语言大作业,就一起在下一章来说吧。
??C语言入门学习到这里已经将近结束了,后续或许会补充一些零星的知识。
??可能以后会更新一下C++的知识,复习用,不过都是后话了。
??我们下章再见!
推荐阅读
- c语言|scanf/fscanf/sscanf,printf/fprintf/sprintf函数的对比
- c++|c++中的extern c以使用
- c语言|指针与指针面试真题
- C语言|求最小公倍数的三种方法(C语言)
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 【C】题目|【C语言】题集 of ⑥
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- 单片机|keil把源代码生成lib的方法
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc