文件操作(C语言)

为什么使用文件

文件在我们日常生活中已经成为不可分割的一部分,只要有电脑就一定离不开文件的使用;从编程的方面来讲我们所写的程序和在程序中开辟的空间在程序结束时就会被销毁,无法对数据进行储存,因此文件的作用就是储存我们所编写的数据,为什么文件可以储存,因为文件并不在电脑的内存之中,而是存在于硬盘中,所以可以长久保存。

什么是文件

文件就是储存在硬盘(磁盘)中的文件,文件分为两种:程序文件和数据文件,二者有很大的区别:程序文件的作用是为了确保程序能够运行起来(通常以 .obj .exe .c 等等为后缀的文件)。数据文件则是储存我们运行的数据的文件。

二进制文件和文本文件

数据文件中又分为二进制文件和文本文件:二进制文件就是以二进制的形式存放在文件中,文本文件是以字符的ASCII码值的形式存放在文件中。区别有:1.二进制文件以四个字节存放。2.文本文件以字符个数的字节数进行存放。比如10000要存放到文件中:二进制会以4个字节存放(整型),文本文件则会以五个字节存放(将10000分成五个字符,每个字符占一个字节)再将数字转换为ASCII码值的二进制进行存放。如图:在这里插入图片描述

文件的打开和关闭

如何在程序中对文件进行打开和关闭是将数据存放/读取在文件中的第一步,我们需要用到fopen函数:FILEfopen(const charfilename,const char*mode).该函数的返回类型是文件指针,专门指向文件的指针。其中的第一部分是文件名,第二部分是打开方式。打开方式如下,其中随着文件的是否存在对应的情况也不同。注意一定要带双引号。
在这里插入图片描述
在了解了文件的打开后,文件的关闭也同为重要,需要用到fclose函数,只需要把文件指针输入进去就可以关闭文件:发close(pf).

文件的顺序读写

文件打开后,就要进行文件的读写,文件的读写同样有着很多的方式:在这里插入图片描述
这里可以巧妙地记住一个规律:前四个函数的末尾字符代表着他们的应用类型,为”c”时说明是针对字符,fgetc将文件中的一个元素以ASCII码值的形式返回整数,我们用printf(“%c ",h)来将返回的整数变回字符。fputc与他无异,只是将元素放到文件中。而后面是s的函数则是将字符串进行同样的操作罢了。fscanf和fprintf相对比scanf和printf函数区别在于后者只能调动键盘与屏幕的操作,而前者是可以额外调动文件,将数据不仅仅打印在屏幕上,可以打印在文件中,只需要在使用时额外加上文件指针即可。重点是fread和fwrite函数:二者结构较为复杂,但可以做到将文件中数据完整的拷贝到另一文件中,size_t fwrite(const voidptr,size_t dize,size_t count,FILEstream)(fread与其结构相同,只是将数据从文件中传到内存中);意思是将ptr所指向的空间的数据写到文件指针为stream的文件中,返回输出的个数,size为每次输出的元素大小,count为输出元素的个数。我们可以创建一个字符数组,先将一个文件中的数据存放在数组中,再利用fwriet函数将数据写到新文件中。

文件的随机读写

在将数据存放在文件中时,我们可以按照自己的想法进行选择如何填写或者读取,不一定按照顺序,函数fseek满足了这个要求:int fseek(FILE*stream,long int offset,int origin);第一个为文件指针,第二个为偏移量,第三个为起始位置。起始位置有三个特殊表达:SEEK_SET(文件起始位置),SEEK_CUR(文件指针当前位置),SEEK_END(文件末尾)。偏移量就取决于起始位置。

文件读取结束的判定

结束的判定各有不同,比如fgetc,当返回NULL时证明读取结束,fread的判定是返回值与输入值不相等时说明文件中的数据已经被读取完。但有个误区,feof函数并没有判断结束的作用,feof的作用是判断一个文件在读取结束后是因为数据全部读完而结束还是文件未读完,其他因素而结束。其判断逻辑为:当文件在读取到最后一个元素时,会先进行读取,再进行下一个元素的读取,当下一个元素不存在时文件会设置EOF来表示文件读取结束,而feof就是通过是否有EOF来判断文件结束的原因,但是当你对文件进行读取且并没有读取超过最后一个元素的时候,即使文件已经读取结束,feof仍会认为文件未读取结束(因为未出现EOF)。

文件缓冲区

ANSIC标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值