1.文件:存储在外部介质上数据的集合
2.文件是有序的数据序列,要访问文件中的数据,必须按照它们的排列顺序,依次访问
3.系统对文件的处理过程:
读(输入):计算机外存--->缓冲区--->计算机内存
写(输出):计算机内存--->缓冲区---->计算机外存
4.文件的分类:
①根据在磁盘的存储格式,分为:
文本文件(TXT/ASCⅡ文件):
文本文中保存的数据用ASCⅡ作为存储方式,先将全部数据转换为ASCⅡ码形式,每个ASCⅡ码占一个字节
文本文件使用编辑软件可以直接阅读
二进制文件:
将数据在内存中以二进制格式存储,直接存入文件中
二进制文件使用编辑器软件不能直接阅读
②从用户观点,分为:
普通文件(磁盘文件):
以磁盘为对象,无其他特殊性能
特殊文件(标准设备文件/标准I/0文件):
以终端为对象标准设备文件;
逻辑文件(设备文件):与主机进行设备交换的输入输出设备(即实际的物理设备)
例如:键盘作为标准输入文件:文件名stdin,
显示器作为标准输出文件:文件名stdout,
打印机作为输入文件:文件名PRN
③从c语言对文件的处理方式看,分为:
缓冲文件:
对每个正在使用的文件,系统自动在内存中为其开辟一个文件缓冲区(即高级文件操作)
非缓冲文件:
系统不自动开辟文件缓冲区,由应用程序自己设置(即低级文件操作)
一、文件的处理:
1.文件类型结构:
FILE类型,包括在头文件stdio.h
文件结构:
typedef struct
{
short level;//文件缓冲区剩余的字节数
unsigned flags;//文件状态标志
char fd;//文件描述符
unsigned char hold;//缓冲区满丢失的字符
short bsize; //文件缓冲区大小
unsigned char *buffer;//文件缓冲区地址
unsigned char *curp;//指针指向当前文件的读写位置
unsigned istemp;//临时文件,指示器
short token;//用于有效性检查
}FILE;
2.文件指针变量: 预包含stdio.h 头文件,形式 FILE *文件型指针变量名
例如:FILE *fp;
fp是一个指针变量指向文件结构,要同时使用多个文件,必须有多个不同的文件指针。
3.c语言中提供了三个标准文件的指针: 标准输入文件(键盘):stdin,
标准输出文件(显示器):stdout,
标准错误输出文件(显示器):stderr
二、文件的操作流程
- 第一步:打开(新建)文件(fopen)
- 第二步:对文件进行操作(读或写)
- 第三步:关闭文件(fclose)
1.打开文件
fopen函数
函数原型:
- FILE *fopen(charc *filename,char *mode);
//使用mode模式打开指定的filename文件
//文件打开成功,返回值为FILE类型的指针
//文件打开失败,返回NULL
调用形式:
fp=fopen (文件名,文件使用方式);
文件名:需要打开的文件名称(字符串)
例如:
fp=fopen(“e:\\code\\test.txt”,”rt”);//以只读方式打开路径为e:/code/est.txt的文件
fp=fopen(“e:/code/test.txt”,”wt”);//以只写方式打开路径e:/code/test.txt文件
fp=fopen("text.txt","r");//只读的方式打开一个和可执行文件在相同路径下的文本文件test.txt
文件使用方式;
"r":读,为读方式(输入)打开文件,该文件必须存在,若文件不存在,则返回NULL
"w":写(输出)方式打开文本文件,若文件不存在,则建立一个新文件,若文件已存在,则将原来的文件清空
"a":追加,在文本文件的末尾增加数据,若文件存在,则保持原来文件的内容,将新的数据增加到原来的后面;若文件不存在,则返回NULL;
"t":文本文件
"b":二进制文件
"+":读和写
文件的其他打开方式:
"r+":对文本文件进行读/写文件不存在返回NULL,若文件存在内容不会被清空
"w+":可以文本文件进行读/写操作,若文件已存在,则将文件原来的内容清空
"a+":文本文件进行读/追加操作,文件内容不会清空
"rb+":对二进制文件进行读/写操作
"wb+":对二进制文件进行读/写操作
"ab+":对二进制文件进行读/追加操作
常见文件打开操作:
if((fp=fopen("d:\\file.txt","r"))==NULL)
{
printf("cannot open file.\n");
exit(0);
}
//以只读方式打开D盘根目录下“file.txt”文件,
//文件打开成功,将为该文件的结构的地址返回存入fp
//如果打开文件失败,fopen函数返回一个空指针,exit( ); 函数:0表示程序正常退出,1表示错误退出
2.关闭文件:
fclose函数:
原型:int fclose (FILE *fp);
调用格式: fclose(fp);
fp:已经打开的文件指针
函数功能:关闭fp指定的文件,切断缓冲区与该文件的联系,并释放文件指针
若文件关闭成功,返回值0,关闭失败,返回非0值
三、文件的顺序读写:
对文件的操作必须按照文件中字符的先后顺序进行,从头到尾主数据读入或写出。
字符串输入输出函数 fgetc fputc
字符串输入输出函数 fgets fputs
格式化输入输出函数 fscanf fprintf
数据块输入输出函数 fread fwrite
1.单字符读写函数:
- 读:int fgetc(FILE *fp);
- 写:int fputc(char ch,FILE *fp
调用形式:
输入函数:ch=fgetc(fp);
//从指定文件中读取一个字符,读取的字符付给变量ch
//对于ASCⅡ文件,若读取字符时文件已经结束或出错,返回EOF(-1)
输出函数:fputc(ch,fp);
//将一个字符输出到指定文件中,即将字符变量ch中的字符输出到fp所指向的文件
//输出操作成功,则函数返回输出的字符,否则返回EOF
2.字符串读写函数
-
读:char *fgets(char *str,int n,FILE *fp);
-
写:int fputs(char *str,FILE *fp);
输入函数:fgets(s,n,fp);//其中参数:char s[ ]; int n; FIFLE *fp;
//从fp所指向的文件中读取长度不超过n-1个字符串(串尾为\0),并将该字符串放到字符数组s中,
//函数的返回值为字符数组s的首地址;文件出错或结束,返回NULL;
//若:已读入n-1个字符,串尾为\0 则:s中存入n-1个字符,串尾为\0
读入字符遇\0 则:s中存入实际读入的字符,串尾\0
读入字符遇见尾文件 则:s中存入实际读入的字符,EOF不存入数组,串尾\0
当文件已经结束时,继续文件 则:函数返回值为空,表示文件结束
例:fgets(s,4,fp)
文本文件内容:abcd\n 数组s:abc\0
d\nabc d\n\0
fEOF f\0
输出函数:fputs(s,fp);//其中参数:char s[ ];FIFLE *fp;
//将字符数组s中的字符串写入文件指针fp所指文件中
//输入成功返回0,失败返回EOF
3.格式化输入输出
输入:int fscanf(FILE fp,”格式化字符串”,[输入项地址表]);
输出:int fprintf(FILE fp,”格式化字符串”,[输入项地址表]);
调用形式:
输入函数:fscanf(fp,格式控制符,变量地址表);//其中参数: FIFLE *fp;
//从fp所指向的ASCⅡ文件中读取字符,按格式控制符的含义存入对应的变量中,返回值为输入的数据个数
输出函数:fprintf(fp,格式控制符,表达式列表);//其中参数:FIFLE *fp;
//将表达式列表中的数据按照格式控制符的说明,存入fp所指向的ASCⅡ文件,返回值为存入的数据个数
3.数据块输入输出
输入:int fread(void *buffer,int size,int count,FILE *fp);
输出:int fwrite(void *buffer,int size,int count,FILE *fp);
调用形式:
输入函数:fread(buffer,size,count,fp);
//从二进制文件fp读取count个数据块存入buffer中,每个数据块的大小为size个字节
//操作成功,函数返回值为实际读入的数据块数量,文件结束或错误,返回值0
输入函数:fwrite(buffer,size,count,fp);
//将buffer中count个数据块写入二进制文件fp中,每个数据块的大小为size个字节
//操作成功,函数返回值为实际写入的数据块数量,文件结束或错误,返回值0
四、文件的随机读写:
1.位置指针返回到头文件
函数原型:void rewind (FILE *fp);
功能:将文件内部指针移到文件开始位置
2.位置移动指针
函数原型:int fseek(FILE *fp,long off,int whence);
功能:将fp所指文件指针从 whence地址移向offset地址。
whence 0--文件开头 1--文件当前位置 2--文件的末尾
3.取位置指针
函数原型:int ftell(FILE *fp); 功能:得到fp所指向文件的当前位置,当出错时返回-1L;五、文件检测:
1.检测文件结束函数:
函数原型:int feof(FILE *fp);功能:判断fp所指文件指针是否位于末尾。是返回1,否返回0
2.检测文件出错函数:
①检查数据输入输出是否出错函数
②清除出错标记及文件结束标记
六、函数实例:
#include<stdio.h>
#include<stdlib.h>
main()
{ FILE *fp;
int i;
char s[20],t[20];
gets(s); //从键盘输入一个字符串
fp=fopen("e:\\stu.txt","w");//以写的方式,打开E盘stu.txt文件
for(i=0;s[i]!='\0';i++)
fputc(s[i],fp);//遍历字符串中各个字符通过fputc();写入文件中
fclose(fp);//关闭文件,完成在txt文本文件中的写操作
fp=fopen("e:\\stu.txt","r");//读的方式打开文件
fgets(t,6,fp); //注意字符串读取末尾带'\0' 从文件中读取5个字符加\0存入t数组
printf("The first t is :%s\n",t);
printf("The current position is:%d\n",ftell(fp));//显示读取字符串后的当前指针位置
fseek(fp,5,1);//从当前位置向后移动5个字节(4个字符和\0)
printf("The current position is:%d\n",ftell(fp));
fgets(t,3,fp);
printf("The second t is :%s\n",t);
rewind(fp);//重置位置指针到开头位置
printf("The current position is:%d\n",ftell(fp));
fgets(t,3,fp);
printf("The last t is :%s\n",t);
fclose(fp);
}
输出结果: