c语言的文件操作是指通过程序来读写文件的操作,本篇文章将对c语言中文件操作进行详细介绍。
前言
我们之前的学习都是直接从键盘输入数据,程序运行结束,内存回收,数据就会消失。现在,我们如果将数据和运算存入文件,那么我们就可以通过外部存储器实现持久性保存。同时,程序可以直接从文件中读取要处理的数据,从而提高了程序的执行效率。
文件的介绍
什么是文件?
文件一般指存储在外部介质(如磁盘、磁带)上有名字的一组相关数据的集合。使用数据文件一般有三个目的:(1)程序和数据分离(2)数据共享 (3)持久化保存数据
一个文件必须有一个唯一的文件标识,以供用户识别和引用。文件名由三部分组成:文件路径+文件名主干+文件后缀,例如:c:\User\code\test.txt
文件的分类
1按照文件的逻辑结构分类
--记录文件,由具有一定结构的记录所组成的文件,如数据库文件
--流式文件,由一个个字节数据或字符数据顺序组成的文件,如可执行文件
2.按照存储介质分类
--普通文件,是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是文件、目标文件、可执行程序:也可以是一组待输入处理的原始数据,或是一组输出的结果。
--设备文件,是指与主机相联的各种外部设备,如显示器、打印机、键盘气在操作系统中,为了便于管理,把外部设备也看作是个文件来进行管理把它们的输入、输出等同于对磁盘文件的读和写。
3.按文件的内容分类(常见讨论)
--程序文件,程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)
--数据文件,是记录文件、图像文件、音视频文件等,⽂件的内容不⼀定是程序,而是程序运⾏时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上的文件。
--文本文件,即ASCII文件,ASCII码文件在磁盘中存放的是每个字符的ASCI码,便于对字符逐个处理。
--二进制文件,是按二进制的编码方式来存放文件的,也就是把内存中自数据原样输出到磁盘文件中
文件的打开和关闭
一个c语言处理的数据文件是一个字节流或者字符流文件,c语言的函数读写程序是以字节数为单位进行的,对文件数据的解析完全依赖程序本身。在c语言中对文件最基本的操作是读文件和写文件,c语言中没有提供对文件的输入输出语句,完全依赖与c语言的标准函数库进行文件的读写。
流与标准流
我们不仅仅可以打开文件,关闭文件,也可以在键盘上输入,在硬盘上进行读写,在网络上传数据从网络获取数据,我们把网络,屏幕等称为外部设备,如果每一种外部设备都要程序员进行相对应的处理,将会带来极大的不方便,所以我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
流是在硬件之上所抽象出来的概念想要给外部设备输入输出数据,只要输入进流里面就可以了,不用关心底层是什么外部设备,这大大降低了程序员学习的难度。
C语言程序在启动的时候,默认打开了3个流:
1、标准输入流:stdin
2、标准输出流:stdout
3、标准错误输出流:stderr
默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接输入输出操作。 stdin、stdout、stderr 它们三个的的类型都是File *
C语⾔中,就是通过 FILE* ,通常称为文件指针。 FILE* 的文件指针来维护流的各种操作的。
文件系统
1缓冲文件系统
缓冲文件系统是一种高级文件系统,是指操作系统自动为正在使用的每个文件开辟一个内存缓冲区
再读写文件时,数据先送到缓冲区,在传到c程序或外存上。缓冲文件系统利用文件指针标识文件
2非缓冲文件系统
非缓冲文件系统是低级文件系统,直接完成程序对文件的读写,它不会自动设置文件缓冲区,缓冲区需要程序员自己设置。同时,它没有文件指针,它使用称为文件号的整数来标识文件。
文件指针
文件指针是一种结构体变量,c编译系统已经将FILE结构定义好,每个被使用的文件都在此中存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)
c语言中每个文件指针都代表唯一一个文件,对文件的任何操作都离不开这个文件指针。
声明文件指针:FILE *pf;
文件的打开和关闭
C语言程序在操作文件时必须遵守操作流程:
( 1 )打开文件:实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。
( 2 )读写文件
( 3 )关闭文件:断开指针与文件之间的联系,把保存在缓存中的数据更新到磁盘保持数据的完整性同时也禁止再对该文件进行操作
文件的打开(fopen函数)
格式为FILE * fopen ( const char * filename, const char * mode );
mode表示文件的打开方式。以下为文件的打开方式汇总。
fopen返回值为一个文件指针,如果打开文件出错,则会返回一个空指针。我们可以利用这个特性来判别是否完成打开文件的工作,并作相应的处理。
文件的关闭函数(fclose函数)
此函数功能为把文件结构体变量及其相关的文件信息和数据写道外存介质中;然后从内存中释放结构变量以及缓冲区的内存空间给系统,最后释放文件指针,让指针指向NULL。
如果正常关闭文件,fclose函数返回值为0。不正常关闭文件,则返回一个非零值EOF(-1),表示有错误发生
格式为int fclose ( FILE * stream );
文件的顺序读写
文件的单字符读函数( fgetc )
形式:字符变量= fgetc (文件指针)
功能:获取文件当前位置指针的字符,并使文件当前位置指针向后移动一位说明:也可以用feof函数来测试是否读完文件读取的文件必须是以读或读写方式打开的。如果执行fgetc函数读字符到了文件尾。则函数返回一个文件结束标志EOF (- 1整数值,不是字符,不能显示在屏幕上)
文件的单字符写函数(fputc)
形式: 整型返回值=fputc(字符,文件指针);
功能:将字符输出到文件指针所指向的文件中去。
说明:文件可以用写、读写、追加方式打开。
如果打开一个不存在的文件,则创新一个新文件后进行写操作;
如果打开一个已经存在的文件,则清除原有的文件内容,写入字符从文件头部开始。
如需保留原有文件内容,写入的字符从文件尾部开始存放,必须以追加方式打开文件,每写入一个字符,文件内部读写位置指针向后移动一个字节
返回值:
如写入成功则返回写入的字符
否则返回一个EOF。
字符串读写函数fgets和fputs
fgets格式: fgets(字符数组名,n,文件指针);
功能:
从文件指针所指的文件中读取字符串并在字符串末尾添加“\0',然后存入数组,最多读n-1个字符
当读到回车换行符、文件末尾或读满n-1个字符时,函数返回该字符串的首地址
说明:如果函数读出成功,函数的返回值为字符串的首地址,如果文件读取数据出错则返回NULL。
fput格式:fputs(字符串,文件指针);
功能:将字符串写入文件中
说明:
字符串可以是字符串常量,也可以是字符数组名,或指针变量✔从字符串的第一字符开始,一直向后直到遇到字符'\0'为止,作为一个完整的字符串写入文件。fputs函数不会把字符'\0'写入文件,文件的读写位置指针向前移动实际输入的字符数个字节。
若出现写入错误,则返回EOF,否则返回一个非负数
数据块读写函数fread和fwrite
1.fread
调用格式:fread(缓冲区首地址,数据项大小size,数据项个数count,文件指针)
功能:读入整块数据
说明:函数从文件指针指向的文件中读count个数据项,每个数据项的大小为size个字节,把数据顺序存放到缓冲区中,读数据块后文件的读写位置指针向后移动了count*size。
如果读数据块成功,则函数返回值为成功读写的数据项个数。如果遇到文件尾读出的字节个数不够count*size,或者读数据块函数操作失败,则函数返回值为EOF。
2.fwrite
调用格式:fwrite(缓冲区首地址,数据项大小size,数据项个数count,文件指针)
功能:写整块数据到文件
说明:
函数从缓冲区向文件指针指向的文件写入count个数据项,每个数据项的大小为size个字节,把count*size个字节的数据顺序存放到文件中。如果写数据块成功,则函数返回值为写入的数据项个数。如果写数据块函数操作失败,则函数返回值为EOF。
格式化读写函数fscanf和fprintf
fscanf函数和fprintf函数的读写对象不是标准输入stdin(键盘)和标准输出stdout(显示器),而是文件。
调用格式: fscanf(文件指针,格式字符串,输入变量地址表列)
说明: fprintf(文件指针,格式字符串,输出变量表列);
后面两个参数与scanf和printf函数类似
如果fscanf执行成功,返回值是成功读取的数据项个数
如果fprintf写入数据到文件成功,返回值是写入到文件中字节的个数如果两个函数操作失败返回EOF。
补充
函数rewind和函数fseek
rewind调用:rewind(文件指针)
功能:是文件的读写位置重新返回文件的开头
fseek调用:fseek(文件指针,位移量,起始点)
功能:读写位置移动到到任何位置
文件的检测
文件结束检测函数feof函数
调用格式feof(文件指针)
功能:判断文件的读写指针是否位于文件的结束位置,如文件结束则返回1,否则为0。
注意:在⽂件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。 feof 的作用是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。
文件出错检测函数ferror
调用方式ferror(文件指针)
功能:检查读写文件是否发生错误,如ferror返回值为零表示未出错,否则表示有错。
清除文件出错标志和文件结束标志函数cleareer
调用格式clearerr(文件指针)
功能:使文件错误标志和文件结束标准置为0。
在读写文件时如果出现了错误标志,就要一直保留,直到对该文件调用了cleanerr函数或者rewind函数或者fseek,或其他的任何一个读写文件函数覆盖为止。
以上是对文件操作的总结,感谢大家的观看!!!!!