C语言的文件创建与文件操作相关的函数

在编程过程中,我们往往需要保留一些程序数据,然而,数据一般会在程序运行结束后也随之被系统回收,类似于函数栈帧的创建与销毁,调用函数时系统会为函数在栈区申请一块内存空间,当函数调用结束后,栈区的这块空间就会被系统收回,该空间的数据也会随之丢失。此外,动态内存管理函数所申请的动态内存空间也需要在程序运行结束之前通过free函数进行释放。那么怎样才能保留数据呢?为了让数据得以保留,我们可以使用文件操作,在文件中的数据并不会受程序运行的影响。本文将围绕C语言中的文件操作展开介绍,主要介绍文件的创建与文件的相关操作,包括文件数据的写入、读取与输入输出,以及文件的拷贝,通过学习文件的这些操作,我们以后就可以将需要的数据保留在文件中,提高我们对内存数据的管理能力。

一、文件创建

文件创建通常有两种方法,我们以VS环境为例。

(1)直接创建:

在VS操作界面上,点击打开文件选项。

随后,右击选择新建项,即可创建文件

创建成功后,如下图所示

(2)程序编译:

我们可以通过写指令‘w’实现对文件的创建,如下

通过fopen和w指令创建一个文件名为test的文本文件,通过指针类型为FILE的pf指针来接收,对pf指针进行判断,若为空指针,则创建失败,pf不为空指针,则创建成功。fclose实现对test文件的关闭,最后程序结束还需将pf指针置为空。

若pf不为空指针,即程序运行成功,则打开文件就会看到文件名为test的文本文件,如下图所示

文件创建成功后,我们可以将数据直接写入test文件中,或者通过w指令来写入。

二、文件操作的相关函数

(1)fgetc函数

fgetc函数可以实现对文件字符的读取,该函数的返回类型为整形,大小为读取字符对应的ASCII码值,该函数读取到文件结尾时停止,返回EOF。

r指令作用表现为对文件的读操作,同样还是需要判断pf是否为空指针,接着定义了一个整形变量ch用于接收fgetc函数的返回值,利用while循环实现对test文件中字符的遍历,通过printf函数将结果打印在屏幕上,最后也需通过fclose函数将文件关闭,pf置为空指针。

(2)fputc函数

fputc函数可实现将字符写入文件中

如上图,通过调用fputc函数将ch字符内容a写入pf指针所指向的文件test中,w即表示对文件的写操作。

此外,通过fputc函数和循环,可实现将字符串的内容写入文件中。

利用for循环和fputc函数,来遍历字符数组str中的元素,当str[i]为\0时,停止读取,实现将str的内容写入pf所指向的文件test中。

(3)fgets函数

fgets函数与fgetc函数类似,区别在于fgets函数用于读取文件中的字符串,用法如下

如上图,fgets函数将test文件中的内容输出到字符数组arr中,fgets函数的三个参数为数组名,数组元素个数,文件指针,fgets函数的返回值为读取字符的地址,当fgets函数读到文件结尾时,返回空指针NULL,停止读取。printf函数将arr中的内容打印在屏幕上,最后也需通过fclose函数将文件关闭,pf置为空指针。

也可通过while循环打印arr中的内容

当fgets返回值不为空指针时循环,即可遍历文件中的字符内容。

(4)fputs函数

fputs函数也可类比fputc函数,fputs函数用于将字符串内容输入到文件中,如下图用法

通过fputs函数实现将字符串的内容hello world输入到pf指针所指向的test文件中,fputs函数的两个函数参数为字符指针,文件指针,成功读取fputs函数的返回值为一个非负整数,失败时返回EOF,当fputs函数读到\0时,停止读取。

(5)fprintf函数

可类比printf函数,printf函数用于把数据以格式化的形式打印在标准输出流上,fprintf函数用于把数据以格式化的形式打印在指定的输出流上,指定的输出流可以是文件,用法如下:

如上图所示,通过调用fprintf函数将结构体s的成员以格式化的形式输出到pf指针所指向的文件test中。fprintf相比printf函数,需添加指定的输出流,上图的输出流为文件test。

(6)fscanf函数

fscanf函数同样也可类比scanf函数,scanf函数用于从标准输入流上读取格式化的数据,fscanf则是从指定的输入流上读取格式化的数据,指定的输入流同样也可以是文件,用法如下:

通过fscanf函数将文件中的内容以格式化的形式输入到结构体s的成员中,fscanf函数相比scanf函数,也需添加指定的输入流,上图的输入流为pf指针指向的文件test,我们采用fprintf函数打印结构体s的成员,输出流为标准输出流stdout,这里的fprintf函数就相当于printf函数。

(7)sprintf函数

sprintf函数的作用是把格式化的数据转化成字符串,以字符串的形式打印出来

如上图,通过sprintf函数将结构体s中的成员以字符串的形式存放在字符数组ch中,sprintf函数的使用格式与fprintf函数一致,ch为存放字符串的数组。

(8)sscanf函数

sscanf函数与sprintf函数刚好相反,sscanf函数的作用是在字符串中读取格式化的数据

如上图,通过调用sscanf函数在字符数组ch中读取格式化的数据存放在结构体S的成员中,sscanf函数与fscanf函数使用一致,ch为存放字符串的数组。

(9)fwrite函数

fwrite函数用于将数据以二进制的形式写入文件中,用法如下

fwrite函数的四个参数分别为读取元素的首地址,元素大小,元素个数,文件指针,二进制文件的写入指令为wb,上图通过调用fwrite函数实现将arr数组元素以二进制的形式写入pf指针指向的文件test中。如上图,test文件的数据以二进制的形式呈现,用户无法正常读取。

(10)fread函数

fread函数与fwrite函数刚好相反,fread函数用于将文件中的二进制数据读取出来,用法如下

fread函数的参数与fwrite函数的参数类型一致,通过调用fread函数将文件test中的二进制数据转化为文本内容存放在arr数组中,通过for循环打印arr数组的内容。

也可以通过while循环调用fread函数来实现读取文件中的二进制内容。

(11)fseek函数

fseek函数用于调整文件指针读取的位置,用法如下

fseek函数的三个参数分别为文件指针,相对于标准点的偏移量,基准点的位置。如上图,fseek的三种写法都是指向了字符f,SEEK_CUR代表指针pf当前所处的位置,pf读取完a,将向后移动一位,指向b,SEEK_SET代表字符串的首地址,SEEK_END为字符串的结尾。

(12)ftell函数

ftell函数用于获取当前文件指针相对于文件数据首地址的偏移量,用法如下

如上图,fseek函数将文件指针pf置于文件末尾,再调用ftell函数获取文件指针pf的位置,返回值即为字符串的长度,大小为9。

(13)rewind函数

rewind函数用于将文件指针回到文件数据的首地址,用法如下

如上图,fseek函数先将文件指针pf置于文件末尾,之后通过调用rewind函数将文件指针pf返回文件数据的首地址,fgetc函数获取首地址的字符,结果为a。

(14)feof函数

feof函数用于判断是否已经读取到文件结尾,若已经读取到文件结尾,feof函数返回一个非零值,如果未达到文件结尾,则返回0,用法如下:

如上图,if语句中调用feof函数,当正常读取到文件结尾时,feof函数返回值为真,表示读取到文件末尾,正常读取字符串,反之则调用ferror函数,表示fgetc函数读取异常。

至此,有关文件操作的函数就全部介绍完了,我们再介绍一个利用这些文件操作的函数实现将一个文件拷贝到另一个文件的操作,即文件拷贝操作。

三、文件拷贝

如上图所示,我们想将test文件的内容拷贝至另一份文件testcopy中,则需对test文件进行读操作,对testcopy文件进行写操作,之后使用while循环中通过fgetc函数将test文件的内容存放到ch中,再通过fputc函数将ch的内容输出到testcopy文件中,从而实现对test文件的拷贝。

结语

本文我们系统地学习了文件创建以及与文件操作相关的函数,最后通过这些函数来实现文件拷贝的功能,同时也掌握了文件指针的使用方法。文件操作是C语言编程中不可或缺的重要技能,它使得程序能够持久化数据,与外部世界进行交互,使程序突破内存限制,实现数据持久化!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值