错题归纳总结
文件:记录在外部介质上的数据的集合,这个数据集有一个名称,叫做文件名
使用数据文件的目的
1、数据文件的改动不引起程序的改动——程序与数据分离
2、不同程序可以访问同一数据文件中的数据——数据共享
3、能长期保存程序运行的中间数据或结果数据
“输入”或“读”:从外部文件中得到数据给程序使用
“输出”或“写”:把程序中数据输出到外部文件中
文件存取方式:顺序存取和直接存取
顺序存取:每当打开这类文件时,进行读或写操作时,总是从文件的开头开始,从头到尾顺序地读或写
直接存取(随机存取):可以通过调用C语言的库函数去指定开始读或写的字节号,然后直接对此位之上的数据进行读,或把数据写到此位置上
文件可以分为文本文件和二进制文件
文本文件:当输出时,数据转换成一串字符,每个字符以字符的ASCII码值存储到文件中,一个字符占用一个字节。当输入时,又把指定的一串字符按类型转换成数据(文本文件特点:存储量大,转换为二进制速度慢,直观易记,便于对字符进行操作)
二进制文件:当输出时,数据不经过任何转换,按计算机内的存储形式直接存放到磁盘上。当输入时,不经过任何转换,而直接将读入的数据存入变量所占内存空间。(二进制文件特点:存储量小,无需转换,便于存放中间结果)
文件输入或输出的时候,系统将为输入或输出文件开辟缓冲区
缓冲区是系统在内存中为各文件开辟的一片存储区。
输出时,数据先填入缓冲区,缓冲区满时才把内容一次性输出到对应文件。
输入时,从输入文件输入一批数据放入缓冲区,输入语句从缓冲区依次读取数据,数据读取完时,再从输入文件中输入一批数据放入。
文件指针
文件指针实际上是指向一个结构体类型的指针,这个结构体类型名为FILE在stdio.h中
FILE *文件指针变量
FILE *pf1, *pf2
pf1和pf2位文件指针
打开文件
在对文件进行读、写操作之前,首先要解决的问题是如何把程序中要读、写的文件与磁盘上实际的数据文件联系起来。C语言中通过调用fopen来实现。
FILE *fopen(char *filename, char *mode);
打开成功返回一个FILE指针,打开失败,fopen函数将返回NULL,当打开文件内发生错误时程序停止运行
程序运行时系统自动打开和关闭三个标准文件:
标准输入——————键盘 stdin
标准输出——————显示器 stdout
标准出错输出——————显示器 stderr
关闭文件
当对文件的读(写)操作完成之后,必须将关闭。关闭文件可调用库函数fclose来实现。调用形式为
int fclose(FILE *pf);
若fp指向文件file_a的文件指针,当执行fclose(fp)后,若file_a为读方式,则文件指针fp与文件file_a脱离关系;若为写,则将文件缓冲区中的剩余数据全部输出到文件,然后fp与file_a脱离关系。
当成功地执行关闭操作后,函数返回0,否则返回非0
读写文件
文件打开之后,就可以对它进行读与写的操作了。
fputc函数(putc函数)
函数原型:int fputc(int c, FILE *fp)
功能:把一字节代码c写入fp指向的文件中
返回值:正常,返回c;出错,为EOF(-1)
fgetc函数(getc函数)
函数原型:int fgetc(FILE *fp)
功能:从fp指向的文件中读取一字节代码
返值:返回读到的代码之;读到文件尾或出错为EOF(-1)
feof函数
调用方式:int feof(FILE *fp)
功能:对于二进制文件读取时判断文件是否结束。
返值:结束1;反之0
fprintf和fscanf函数
一般调用格式:fscanf(fp,格式字符串,输入列表);
fprintf(fp,格式字符串,输出列表);
返回:成功,返回I/O的个数;出错或文件尾,返回EOF
由于输入输出时要进行ASCII码和二进制形式的转换,费时较多
fscanf(fp,"%d,%f",&i,&t);
若文件中有3,4.5,则将3读出送入i,4.5读出送入t*//*文件中文本的格式要和函数中控制格式字符串对应,有“,”文件中也要有,否则失败。在做配置文件处理时很方便*/
fprint(fp,"%d,%6.2f",i,t);
/*将i和t按%d,%6.2f格式写入到fp文件中*/
fgets和fputs函数
形式:fgets(str,n,fp);(str字符数组,n-1个字符,自动加入‘\0’)
fputs(字符串,fp);("\0"不输出,也不加‘\n’)
作用:从fp指向的文件读/写一个字符串
返回值
fgets正常时返回字符串的首地址;出错或文件尾,NULL
fputs正常时返回写入的最后一个字符;出错为EOF
fread与fwrite函数
一般形式:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
参数说明:
buffer:要读入的数据块的存放首地址或要输出的数据块的起始地址。
size:每个要读/写的数据块的大小(字节数)
count:要读/写的数据块的个数
fp:要读/写的文件指针
返值:成功,返count的值;出错或文件尾,0值
说明:fread与fwrite一般用于二进制文件的输入/输出
若文件以二进制形式打开,用fread与fwrite可读写任何类型的数据。
文件定位:
相关概念
文件位置指针————指向当前读写位置的指针,具体位置由文件打开方式确定
“r”"w":指向文件头
“a”:指向文件尾
读写方式
顺序读写:位置指针按字节位置顺序移动
随机读写:位置指针需要移动到任意位置
fseek函数和随机读写
调用形式:fseek(文件类型指针,位移量,起始点)
fseek(pf,offset,origin);
功能:改变文件位置指针的位置
返值:成功,返回0;失败。返回非0值
ftell函数
函数原型:long ftell(FILE *fp)
功能:得到文件当前位置指针(用相对于文件开头的位移量表示)
返值:
返回当前位置指针位置;失败,返回-1L
rewind函数
函数原型:void rewind(FILE *fp)
功能:重置文件位置指针到文件开头
返值:无