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


七、 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

  • 文件出错检测:
    ferror(fp)——对于任何一次读写操作,除了看返回值外,还可以调用这个函数查看是否出错,返回0表示没有出错,非0表示出错。
      注意的是,每次新的读写都会改变ferror的返回值,要及时访问。
    clearerr(fp)——ferror如果检测出出错,就一直保留非0值,直到下一次更新,我们也可以给它手动复位,clearerr(fp)就负责复位ferror。

  这章说的比较快,因为大家都写过word吧,这个读写的概念很常见,文件的概念也比较常见,我现在打字就能看到这个光标跟着字走,打一个就前进一个,删一个就后退一个,这就是文件位置标记,大家想必也有文件打不开,莫名其妙就弹个警告然后卡退了,或者你把文件删除了,然后还是从快捷方式打开,就会提示快捷方式占不到文件,就是文件打开失败,C语言有函数来判断这些,概念什么的没有很难的,函数又是现成的,用起来还是比较顺手的。

  文件操作的程序例子单拿出来也写不出啥,下一章会做一个C语言大作业,就一起在下一章来说吧。
  C语言入门学习到这里已经将近结束了,后续或许会补充一些零星的知识。
  可能以后会更新一下C++的知识,复习用,不过都是后话了。
  我们下章再见!

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值