入门教程|C语言总结项目和入门——文件操作


文章目录

  • 七、 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+ 读写(二进制文件),文件不存在就出错
??注:w方式只写,写入时会删除原来存在的,再写入。
??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。
??这章说的比较快,因为大家都写过word吧,这个读写的概念很常见,文件的概念也比较常见,我现在打字就能看到这个光标跟着字走,打一个就前进一个,删一个就后退一个,这就是文件位置标记,大家想必也有文件打不开,莫名其妙就弹个警告然后卡退了,或者你把文件删除了,然后还是从快捷方式打开,就会提示快捷方式占不到文件,就是文件打开失败,C语言有函数来判断这些,概念什么的没有很难的,函数又是现成的,用起来还是比较顺手的。
??文件操作的程序例子单拿出来也写不出啥,下一章会做一个C语言大作业,就一起在下一章来说吧。
??C语言入门学习到这里已经将近结束了,后续或许会补充一些零星的知识。
??可能以后会更新一下C++的知识,复习用,不过都是后话了。
??我们下章再见!

    推荐阅读