用fopen函数打开数据文件
fopen函数的调用方式为:fopen(文件名,使用文件方式);返回值为指向文件的指针,通常返回值赋给一个指向文件的指针变量。eg:
FILE *fp; //定义指向文件的指针变量fp
fp=fopen(“a1”,”r”); //表示要打开名字为a1的文件,使用文件方式为
//“只读”,并将fopen函数的返回值赋给指针变量fp
文件使用方式 |
含义 |
如果指定的文件不存在 |
r(只读) |
为了输入数据,打开一个已存在的文本文件 |
出错 |
w(只写) |
为了输出数据,打开一个文本文件 |
建立新文件 |
a(追加) |
向文本文件尾添加数据 |
出错 |
rb(只读) |
为了输入数据,打开一个二进制文件 |
出错 |
wb(只写) |
为了输出数据,打开一个二进制文件 |
建立新文件 |
ab(追加) |
向二进制文件尾添加数据 |
出错 |
“r+”(读写) |
为了读和写,打开一个文本文件 |
出错 |
“w+”(读写) |
为了读和写,建立一个新的文本文件 |
建立新文件 |
“a+”(读写) |
为了读和写,打开一个文本文件 |
出错 |
“rb+”(读写) |
为了读和写,打开一个二进制文件 |
出错 |
“wb+”(读写) |
为了读和写,建立一个新的二进制文件 |
建立新文件 |
“ab+”(读写) |
为了读和写,打开一个二进制文件 |
出错 |
对文件读写字符与字符串
函数名 |
调用形式 |
功能 |
返回值 |
fgetc |
fgetc(fp) |
从fp指向的文件读入一个字符 |
读成功带回所读的字符,失败则返回文件结束标志EOF(即-1) |
fputc |
fputc(ch,fp) |
把字符ch写到文件指针变量fp所指向的文件中 |
输出成功,返回值就是输出的字符,失败则返回EOF(即-1) |
feof |
feof(fp) |
检查文件尾标志是否被已被读取过 |
文件尾标志已被读出,则表示文件已结束,返回1,否则返回0 |
fgets |
fgets(str,n,fp) |
从fp指向的文件读入一个长度为(n-1)的字符串,存放到字符数组str中 |
读成功,返回地址str,失败则返回NULL |
fputs |
fputs(str,fp) |
把str所指向的字符串写到文件指针变量fp所指向的文件中 |
输出成功,返回0;否则返回非零值 |
#define putc(ch,fp) fputc(ch,fp)
#define getc(fp) fgetc(fp)
这是在stdio.h中定义的,因此在程序中putc,getc和fputc,fgetc作用是一样的。
用格式化的方式读写文本文件
fprintf(文件指针,格式字符串,输出表列);
eg:fprintf(fp,”%d,%6.2f”,i,f);
fscanf(文件指针,格式字符串,输入表列);
eg:fscanf(fp,”%d,%f”,&i,&f);
两个函数作用与printf和scanf类似,只是对屏幕操作改为了对文件操作。
用二进制方式向文件读写一组数据
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer:是一个地址。
size:要读写的字节数。
count:要读写多少个数据项(每个数据项长度为size)。
fp:FILE类型指针
这两个函数是int型函数,返回值为实际读取到的count的值,即实际输入或输出数据项的个数。
eg1:fread(f,4,10,fp);其中f是一个float型数组名(代表数组首元素地址)。这个函数从fp所指向的文件读入10个4字节的数据,存储倒数组f中。
eg2:
struct Student_type{
… …
}stud[40];
for(int i=0;i<40;i++)
fread(&stud[i],sizeof(struct Student_type),1,fp);
执行40次循环,每次从fp指向的文件中读入结构体数组stu的一个元素。
同理可以有输出语句:
for(int i=0;i<40;i++)
fwrite(&stud[i],sizeof(struct Student_type),1,fp);
随机读写数据文件
rewind(文件类型指针)
作用是使文件位置标记返回文件开头,同时feof函数的值会恢复为0(假)。此函数没有返回值。eg:rewind(fp);
fseek(文件类型指针,位移量,起始点)
起始点 |
名字 |
用数字代表 |
文件开始位置 |
SEEK_SET |
0 |
文件当前位置 |
SEEK_CUR |
1 |
文件末尾位置 |
SEEK_END |
2 |
“位移量”指以“起始点”为基点,向前移动的字节数。位移量应是long型数据(在数字的末尾加一个字母L,就表示是long型)。eg:
fseek(fp,100L,0); //将文件位置标记向前移到离文件开头100个字节处
fseek(fp,50L,1); //将文件位置标记向前移到离当前位置50个字节处
fseek(fp,-10L,2); //将文件位置标记从文件末尾处向后退10个字节
ftell(文件类型指针)
作用是得到流式文件中文件位置标记的当前位置,用相对于文件开头的位移量来表示。如果调用函数出错,返回值为-1L。eg:long i=ftell(gp);
ferror(文件类型指针)
作用是检测在调用各种输入输出函数时是否出现错误。如果返回值为0(假),则未出错,如果返回一个非零值,表示出错。
注意:对同一个文件每一次调用输入输出函数都会产生一个新的ferror函数值,因此,在调用一个输入输出函数后应立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror的初始值自动置为0。
clearer(文件类型指针)
作用是使文件出错标志和文件结束表示置为0。只要文件出现读写出错标志,它就一直保留,直到对同一文件调用clearerr函数或rewind函数。假设在调用一个输入输出函数时出现错误,ferror函数值为非零值,应立即调用clearerr(fp),使ferror(fp)的值变成0,以便在进行下一次检测。