内容正文:
第11章 文件
本章内容
11.1文件概述
11.2文件的打开与关闭
11.3文件读写函数
11.4文件定位与随机读写
11.5文件检测函数
11.6综合案例
11.4文件定位与随机读写
文件的定位
rewind函数
fseek函数
ftell函数
rewind函数
功能:把文件内部的位置指针移到文件首
函数的调用形式为:
rewind(FILE *stream);
例如:rewind(fp);
fseek函数
函数的调用形式为:
fseek(FILE *stream,long offset,int origin);
其中:
stream表示指向被移动的文件的指针;
offset表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错,当用常量表示位移量时,要求加后缀“L”;
origin表示从何处开始计算位移量,规定的起始点有三种:
文件开头
当前位置
文件末尾
位置指针起始位置及其代表的符号
起始点 符号代表 数字表示
文件开头 SEEK_SET 0
当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
fseek函数
例如:
fseek(fp,100L,0);
或
fseek(fp,100L,SEEK_SET);
意义:把fp所指向的文件位置指针移到距离文件开头100个字节处
ftell函数
功能:用于获取文件的当前读写位置
函数的调用形式为:
long ftell(FILE *stream)
例如:b=ftell(fp);
文件的随机读写
fread和fwrite函数来实现随机读写
程序举例
【例11.8】写入5个学生记录,记录内容为学生姓名、学号、两科成绩。写入成功后,由用户输入一个记录,读取并显示指定记录的内容。
分析:
(1)定义结构体student,并定义一个数组st[5]和stu1,用来保存用户输入的所有学生成绩信息和读取的指定学生的成绩信息。
(2)以二进制只写方式打开文件c:\student.txt。
(3)输入学生成绩信息,并将结果利用fwrite函数写入文件c:\student.txt中。
(4)重新以二进制只读的方式打开文件c:\student.txt。
(5)输入要查询的记录号。
(6)利用fseek函数定位文件指针,并利用fread函数读入成绩信息,并保存到stu1变量中。
(7)输出stu1变量的内容。
查看源代码
数据输入时gets的应用
在输入过程中为了不出现过多的麻烦,用gets来输入所有成员的值,然后用以下函数转化为相应的类型:
int atoi(char *) 将字符串转换为整数。
double atof(char *) 将字符串转换为实数。
long atol(char * ) 将字符串转换为长整型。
11.5文件检测函数
文件结束检测函数feof
功能:检测文件指针是否处于文件结束位置
函数的调用形式为:
int feof(FILE *stream);
stream为指向文件的指针;
如文件结束,则返回值为1,否则为0
例如:
while(!feof(fp))
{
文件操作语句
}
读写文件出错检测函数ferror
功能:检测文件在用各种输入输出函数进行读写时是否出错
函数的调用形式为:
int ferror(FILE *stream);
stream为指向文件的指针;
如果返回值为0,表示读写数据时未出错,否则表示出错。
文件出错标志和文件结束标志置0函数clearerr
功能:清除出错标志和文件结束标志
该函数的调用形式为:
clearerr(FILE *stream);
stream为指向文件的指针。
11.6综合案例
【例11.9】编写一个文件加密的程序。用户输入一个文件名,输入一个整数作为密码,可以对文件进行加密。
加密思想:在位运算中,假设c=a^b,那么c^b的结果为a,因此我们可以把a当作原数据,b作为加密密码,c则为加密后的数据;如果需要将原数据a加密,只需将a异或密码b即可;如果需要解密,只需要将加密结果再次异或密码b即可。
分析:
编写函数encrypt(char *filename,int password),功能为利用password将文件filename加密。
在encrypt函数中,以二进制读写方式打开filename文件。
利用fgetc读取一个字符到ch中,ch=ch^password,因为fgetc函数使得文件的指针自动下移,因此,如果想将加密的结果写入原来位置,文件指针必须前移1位,即用fseek(fp1,-1,SEEK_CUR);之后利用fputc函数将加密结果写入文件,然后需要将文件指针移动2位,读取下一个字符。循环读取、加密、写入。
解密操