文件
1、文件类型指针
定义文件类型指针的一般形式:
-
语法:FILE *文件指针变量名
-
样例:FILE *fp;
-
说明:指针变量名用于指向一个已经打开的文件,实际上是指向文件缓冲区的首地址。
2、文件的打开与关闭
-
文件的打开fopen()
- 语法:FILE *fopen(const char *filename,const char *mode)
- 样例:fp=fopen(“student.txt”,“r”);
- 说明:
- 若文件打开成功,则 fopen()函数为需要打开的文件分配一个缓冲区,并返回该缓冲区的首地址,通常将该返回值赋值给一个文件指针变量;若文件打开失败则返回 NULL。
- 参数 filename 指需要打开的文件名。
- 参数mode 指文件的读写方式。
- 数 filename 和 mode 都是字符串!
-
文件的使用方式
使用 fopen()函 数打开文件时,通常还要判断是否成功打开文件:
if ((fp = fopen ("文件名","文件使用方式")) = = NULL) { printf("Can not open this file!\n "); exit(1); }
注:使用 exit()函数,需要加上 stdlib.h 头文件。
-
文件的关闭fclose()
语法:fclose(FILE *fp)
样例:fclose(fp);
说明:
- fclose()函数的功能是将由文件指针指向的缓冲区中的数据存放到外存文件中,然后释放该缓冲区,从而中断了文件指针与缓冲区之间的联系。
- 若文件关闭成功,则返回 0,否则返回 EOF(-1)。
3、文件的读写
-
字符读写函数:fgetc() fputc()
主要适用于文本文件
-
fputc()
- 语法:int fputc(int c,FILE *fp)
- 样例:fputc(c,fp);
- 说明:
- 函数返回一个整型值,如果写成功,则返回写入字符的 ASCII 代码值,否则返回 EOF,即-1。
- c 是待写入的字符内容,可以是字符变量,也可以是字符常量或字符型表达式。
- fp 是文件指针,指向已打开的文件。
-
fgetc()
- 语法:int fgetc(FILE *fp)
- 样例:ch=fgetc(fp);
- 说明:函数返回一个整型值,如果调用成功,这个整型值代表读出字符的 ASCII 代码值;如果遇到文件结束或者调用有错,返回 EOF。
-
无论执行读还是写任务,文件指针 fp 都会自动后移一个字节,以便进行下一次的读写操作
-
-
字符串读写函数:fgets() fputs()
-
fgets()
- 语法 :char *fgets(char *s,int n,FILE *fp)
- 样例:fgets(s,n,fp);
- 说明:
- fgets()函数从fp 指向的文件的当前位置最多读取
n-1
个字符存入 s 指向的内存区,串末尾自动 添加’\0’。- 若在遇到回车符或文件结束符之前,已经读取了 n-1 个字符,则读取结束,在末尾 添加’\0’组成字符串,存入 s 指向的内存区。
- 若在未读满 n-1 个字符时提前遇到换行符,则读取结束,在换行符之后添加’\0’组成 字符串,存入 s 指向的内存区。换行符也被读取。
- 若在未读满 n-1 个字符时提前遇到文件结束符,则读取结束,将文件结束符换为’\0’ 组成字符串,存入 s 指向的内存区。
- 如果读入成功,返回 s 的首地址;否则返回 NULL。
- s 是一个字符内存区首地址指针,n 是一个整型量,fp 是指向某个已打开的文件的指针。
- fgets()函数从fp 指向的文件的当前位置最多读取
-
fputs()
将一个字符串写入到指定文件中
- 语法:int fputs(const char *s,FILE *fp)
- 样例:fputs(s,fp);
- 说明:
- fputs()函数将指定的字符串写入到 fp 指向的文件中。
- 如果写成功,则返回 0,;否则返回 EOF。
- 字符串最后的’\0’并不写到文件中去,也不自动加换行符’\n’。
-
-
数据块读写函数 fread()和 fwrite()
主要用于二进制文f件的读写。
-
fwrite():将一组数据以二进制形式写到指定的文件中
-
语法:int fwrite(void *buffer,int size,int n,FILE *fp)
-
样例:
FILE *fp; int score[5]={70,90,80,80,90}; fwrite(score,sizeof(int),5,fp);
-
说明:
- fwrite()函数从程序数据库区 buffer 开始,将 n 项长度为 size 的字节数据写入到 fp指向的缓冲区。
- 调用成功,实际写入的项数; 否则返回小于等于 0的数据。
- buffer 为要输出的数据首地址;size 为每个数据项的字节数;n 为要写出的数据项的个数;fp 为 指向已打开文件的指针。
-
-
fread():用来从指定文件中以二进制格式读取一组数据存入指定的内存区
-
语法:int fread(void *buffer,int size,int n,FILE *fp)
-
样例:
FILE *fp; int score[5]={70,90,80,80,90}; fwrite(score,sizeof(int),5,fp);
-
说明:
- fread()函数从fp 所指的文件中,读取 n 个长度为size 的字节数据,保存到 buffer 所指向的内存缓冲区中。
- 调用成功,返回实际读到的项数; 否则返回小于等于 0的数据。
-
-
-
fscanf()和 fprintf()函数
-
fscanf(): 从指定的文件中格式化读数据
-
语法:int fscanf(FILE *fp,格式 控制说明,地址表)
-
样例:fscanf(fp, “%d%d”,&a,&b);
-
说明:
- 根据格式控制说明,从指定文件中读数据,存放到由地址表指定的位置上。
- 如果读入成功,返回值是实际读到的项数,否则返 回小于等于0的数。
-
-
fprintf() : 向指定的文件中格式化写数据
- 语法:int fprintf(FILE *fp,格式控制说明,输出表);
- 样例:fprintf(fp, “%d %d”,a,b);
- 说明:
- 根据格式控制说明,向指定的文件中格式化写数据
- 如果写入成功,返回值是实际写出的项数,否则返回小于等于0的数。
-
4、文件定位
-
rewind():数使文件读写指针指向文件头
-
fseek():将文件读写指针移动到指定的位置
- 语法:int fseek(FILE *fp,long offset,int from)
- 说明:
- 将文件指针移动到与 from 所指定的文件位置距离 offset 字节的地方。如果移动成功, 返回值 0,出错时返回非 0 值。
- fp 为文件指针;offset 为字节偏移量;from 表示起始位置,它必须是 0、1、2中的一个,其中 0 表示起始位置是文件头, 1 表示起始位置是当前位置,2表 示起始位置是文件尾。
- 若 offset 是正数,表示向文件尾移动;0 表示回到起始位置;负数表示向文件头移动。
-
ftell():用来返回文件的当前读写位置