需要快速查看文件操作函数可以直接点击目录跳转。
文件相关概念:
文件的概念:
文件:是指驻留在外部介质(如磁盘)中的一个有序数据集,可以是源文件、目标程序文件、可执行程序,当然也可以是待输入的原始数据,或是一组输出的结果。
其中源文件、目标文件和可执行程序称为程序文件,输入输出数据属于数据文件。
文件的分类:
数据文件分为文本文件和二进制文件。
文本文件是以字符ASCII码值进行储存与编码的文件,其文件的内容就是字符。
二进制文件是储存二进制的文件。
文件的实质:
C语言把文件看作数据流,将数据按顺序以一维方式组织储存。
可以简单理解成录音磁带,录音和放音的过程是顺序进行的。文件的储存和读取也是顺序进行的。文件打开即打开流,关闭文件即关闭流。
数据流又分为字符流和二进制流,前者属于文本文件,后者属于二进制文件。
文件打开关闭的本质(缓冲文件系统)
首先C语言的的文件打开与存入是对磁盘操作。
由于系统对不同文件读取速度不同,为了避免拥挤,C程序采用缓冲文件系统,即程序和磁盘间通过缓存区进行交互,你可以把它看作一个中介。
在操作数据时,系统自动为每一个文件分配一块文件内存缓冲区(内存单元),当程序要向磁盘写入数据时,先把数据储存到缓存区,然后由操作系统把缓存区数据写入磁盘。
文件储存在磁盘上的,磁盘数据按扇区组织,规定每个扇区大小为512B(1B=1字节),缓存区的大小由C语言版本决定。
文件相关操作:
1.文件类型指针
FILE *fp//定义FILE结构指针
FILE是文件类型定义符,fp是文件类型的指针变量。
注意:文件指针fp不能像普通指针一样可以进行fp++或*fp等操作,fp++意味指向下一个FILE文件结构(前提是存在下一个)。
2.打开文件和关闭文件
打开:
fopen("文件名","文件打开方式");
该函数有返回值,若打开成功返回包含文件缓存区等信息的FILE结构地址,否则返回一个NULL(空值)的FILE指针。
文件名需要写出文件的路径,路径若包含绝对完整路径,定位子目录用的斜杆“\”需要用“\\”,因为在C语言中认为'\'是转义符。'\\'表示的是实际意义上的'\'。
文件打开方式:
“r”:以只读的形式打开文本文件(不存在则出错)
“w”:以只写的形式打开文本文件(若不存在则新建,反之,则从文件起始位置写,覆盖原内容)
“a”:以追加的形式打开文本文件(若不存在,则新建;反之,在原文件后追加)
“r+”:以读写的形式打开文本文件(读时,从头开始;写时,新数据只覆盖所占的空间)
“wb”:以只写的形式打开二进制文件
“rb”:以只读的形式打开二进制文件
“ab”:以追加的形式打开一个二进制文件
“rb+”:以读写的形式打开二进制文件。
“w+”:首先建立一个新文件,进行写操作,然后从头开始读(若文件存在,原内容将全部消失)
“a+”:功能与”a”相同。只是在文件尾部追加数据后,可以从头开始读
为保证文件操作的可靠性,我们常常使用if判断,以确保文件正常打开后在对其进行读写操作。
其形式为:
if((fp=fopen("naughty.txt","r"))==NULL)
{
printf("File open error!\n");
exit(0)//系统标准函数,关闭所有打开的文件,并终止程序的进行
}
注意:C语言支持同时打开多个文件,但不支持同一文件在关闭前被再次打开(重复打开一个文件)。
关闭:
fclose(文件指针);
该函数的返回值是一个整数,若返回值为0则表示关闭成功,否则则为无法正常关闭。同样可以使用if语句来保证期被关闭后再进行后续操作。
if(fclose()fp)
{
printf("关闭失败");
exit(0);
}
关闭文件操作会使缓存取得的数据强制写入磁盘,还会释放文件缓存区单元和FILE结构,使文件指针与具体文件脱钩。
3.文件的读写
1.字符方式文件读写函数fgetc()和fputc():
ch=fgetc(fp);//从文件中读取一个字符(类似于getchar())
fputc(ch,fp);//将ch写入文件,成功返回ch,失败返回EOF
2.字符串方式文件读写函数fgets()和fputs():
fputs(s,fp);//将s写入文件。成功返回s的最后一个字符,失败返回EOF(s末尾\0不写入文件)
fgets(s,n,fp);//将s写入文件,最多读取长度为n(写入后最后自动添加'\0')
fgets()成功返回字符串,失败返回EOF.
3.格式化方式文件读写函数fscanf()和fprintf():
fscanf(fp,"%d",&a);
fprintf(fp,"%d",a);
4.其他相关函数
1.获取指针当前位置ftell()
ftell(文件指针);//出错时返回-1L
ftell()函数用来获取当前文件读写位置指针的位置,吉祥对于文件开头的位移量(字节数)。
2.指针移动控制函数fseek()
fseek(fp,offfset,from);
offset表示移动偏移量,它应是long型数据,使用常量时,应加上后缀“L”。from表示从哪个位置开始计算偏移量。
3.文件末尾检测函数feof()
feof(fp);//成功返回1,表示已经到了文件结束位置,否则返回0,表示文件还未结束。
一般用!feof(fp)表示文件是否结束的循环条件。