分享一些我在学习C语言文件时学习到的知识点。
文件
概念:
文件是存储在外部存储介质上(如磁盘)的数据的集合。
文件有俩大类:第一类是程序文件(源文件.c 目标程序文件.obj 可执行文件.exe);第二类是数据文件(文件里是输入输出数据,如文本文件,图像文件,声音文件)
数据文件分类:
按数据存储的编码形式,数据文件可分为文本文件和二进制文件两种。文本文件是以字符ASCII码值进行存储与编码的文件,其文件的内容就是字符。二进制文件是存储二进制数据的文件,按字节来存储。
(C语言源程序是文本文件,C程序的目标文件和可执行文件是二进制文件。)
缓冲文件系统
进行文件操作时,系统为每一个文件分配一块文件内存缓冲区(内存单元,一个磁盘扇区大小,512B),先把磁盘读出的数据放在缓存区,计算机在直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取。这样可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度.
文件类型指针:FILE *fp
文件操作具有顺序性特点,前一个数据读取后,下一次将顺序读取后一个数据(文件内部位置指针后移一位)
fopen
fp=fopen("文件名","文件打开方式")
文件名如果不指定文件路径,默认与当前应用程序当前路径相同
判断文件是否正常打开:
if((fp=fopen("abc.txt","r"))==NULL)
{
printf("File open error");
exit(0);
}
文件打开方式:
r:打开文本文件进行只读
w:建立新文本文件进行只写
a:打开文本文件进行追加
r+:打开文本文件进行读/写
w+:建立新文本文件进行读/写
a+:打开文本文件进行读/写/追加
rb:打开二进制文件进行只读
wb:建立新二进制文件进行只写
ab:打开二进制进行追加
rb+:打开二进制文件进行读/写
wb+:建立新二进制文件进行读/写
ab+:打开二进制文件进行读/写/追加
读文件,文件必须存在,否则出错
写文件:
如果文件不存在,新建文件;
如果存在,w将原文件删除然后重新建立,a写入数据添加在文件原数据后面,不删去原文件内容
fclose
fclose(文件指针);文件关闭返回0
判断文件是否正常关闭:
if(fclose(fp))
{
printf("can not close the file");
exit(0);
}
文件字符方式读写函数fgetc()和fputc
ch=fgetc(fp)
fputc(ch,fp)
打开文件时fp指针指向文件首部,fgetc()函数在读到有效字符时,会向后移动指针,若读到文件末尾,则会读到一个无效的字符,返回EOF
EOF(^z、ctrl+z):
文件结束符,它不是常规的ASCII码,而是一个值为-1常量,读文件时通过判断文件读入字符是否为eof来决定循环是否继续
只是为了标识已经读到文件末尾,它并不是一个存储在文件中的字节
文件末尾检测函数feof()
feof(fp),函数返回1表示到了文件结束位置,0表示文件未结束。任何文件都能判断是否结尾
feof通过 已读 的字符是不是合法字符来判断是否到了文件末尾,判断的是已读取的字符(feof使用前,必须有文件读函数fgetc,fread,才能有意义)
判断文件是否结尾:
文本文件:
ch=getchar(fp);
while(ch!=EOF)
ch=getchar(fp)
或者
ch=getchar(fp);
while(!feof(fp))
ch=getchar(fp)
二进制文件:ch=getchar(fp);
while(!feof(fp))
ch=getchar(fp)
文件字符串读写函数fputs()和fgets()
fputs(s,fp)
s是字符串地址,fp是文件指针
fgets(s,n,fp)
s是字符数组名或字符指针。从文件fp读取字符串(最多n-1个字符)到s里
格式化方式文件读写函数fscanf()和fprintf()
fscanf(文件指针,格式字符串,输入表)
fprintf(文件指针,格式字符串,输出表)
例:fscanf(fp,"%d%f",&n,&x);fprintf(fp,"%d%f",n,x);
数据块方式文件读写函数fread()和fwrite()
(多用于二进制文件。数据块是一组数据,如数组,结构变量)
fread(buffer,size,count,fp)
fwrite(buffer,size,count,fp)
buffer是指针,输入输出数据的地址
size是数据块字节数,即数据块大小(sizeof)
count是数据块数
例:struct sysuser u[5],*pu=u;
fwrite(pu,sizeof(struct sysuser),5,fp);
重定位文件首函数rewind()
定位文件读写位置指针 指向文件首地址
rewind(fp)
指针移动控制函数fseek()
fseek(fp,offset,from)
fp是文件指针
offset表示移动偏移量(常用到sizeof,如sizeof(struct data),也可是常量,如20L为20个字节),正值表示从当前位置向后计算,负值为向前计算。
from表示从哪里计算偏移量(0为文件首部,1为当前位置,2为文件末尾)
获取指针当前位置函数ftell()
返回值是相对于文件开头的位移量(字节数)
例:end=ftell(fp)
读写错误检查函数ferror()
检查文件在各种输入输出函数进行读写时是否出错,返回0未出错,否则有错
ferror(文件指针)
出错标记清除函数clearerr()
清除出错标志和文件结束标志,使他们为0值
clearerr(文件指针)