目录
1,文件概述
文件是指存放在外部存储介质(可以是磁盘、光盘、磁带等)上的数据集合。操作系统对外部介质上的数据是以文件形式进行管理的。打开二个文件或者创建一个新文件时,一个数据流和一个外部文件(也可能是一个物理设备)相关联。为标识一个文件,每个文件都必须有一个文件名作为访问文件的标志,其一般结构为文件名.扩展名。
根据文件的存储形式,可分为ASCII码文件和二进制文件。
ASCIH文件也称为文本文件这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。
例如,数1124的存储形式
ASCII码: 00110001 0011001 00110010 00110100
十进制数: 1 1 2 4
共占用4个字节。ASCII码文件可在屏幕上按字符显示。例如,源程序文件就是ASCII码文件,用DOS命令中的TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。
二进制文件是按二进制的编码方式来存放文件的。例如,数1124的存储形式为00000100 01100100只占两个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。
2,文件指针
在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。
其定义的一般形式为:FILE *指针变量标识符;
3,文件的打开与关闭
文件在进行读写操作之前要先打开,所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其他操作。要打开指定的文件可使用 fopen的函数。
FILE *fopen(char *filename,char *mode);
功能:使用mode模式打开指定的filename文件。如打开文件成功, 则返回一个FILE类型的指针 如打开文件失败,则返回NULL。
其中,第一个参数filename用来设定打开的文件。若打开的文件与执行文件路径(文件夹)相同,只写文件名即可;若数据文件和程序文件分别存放在不同的文件夹,就必须指定完整的路径和文件名。第二个参数 mode用来定要打开的文件类型和指定文件的访问模式第二个参数必须为字符串格式,头尾必须用双引号括起来。
例如:以只读方式打开一个和可执行文件在相同路径的文本文件test.txt。
FILE *fp;
fp=fopen("test.txt","r");
又如:以只读方式打开一个E盘下code文件夹下的excel文件 data.xls。
FILE *fp;
fp=fopen("e:\\code\\data.xls","r");
文件的访问模式
“It” 只读打开一个文本文件,只允许读数据
“wt” 只写打开或建立一个文本文件,只允许写数据
“at” 追加打开一个文本文件,并在文件末尾写数据
“rb” 只读打开一个二进制文件,只允许读数据
“wb” 只写打开或建立一个二进制文件,只允许写数据“ab” 追加打开一个二进制文件,并在文件末尾写数据“It+” 读写打开一个文本文件,允许读和写
“wt+” 读写打开或建立一个文本文件,允许读和写
“at+” 读写打开一个文本文件,允许读,或在文件末追加数据“rb+” 读写打开一个二进制文件,允许读和写
“wb+” 读写打开或建立一个二进制文件,允许读和写
“ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据
文件打开后若不再继续使用,则使用felose()函数将指定的文件关闭,并将FILE文件针的相关资源及所占用的缓冲区归还给系统。
int fclose(FILE*fp);
功能:将文件指针 fp所指的文件关闭。若返回0,则表示美闭成功;若返回非0值,则表示有错误发生。例如:
fclose(fp);
4,文件的顺序读写
4.1 单字符读写函数
字符读写函数是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。 读单字符函数fgetc()
int fgetc(FILE *fp);
功能:读取文件指针 fp目前所指文件位置中的字符,读取完毕,文件指针自动往下移一个字符位置,若文件指针已经到文件结尾,则返回-1。
ch=fgetc(fp);//从fp所指的文件中读取一个字符并送入ch中。
写单字符函数 fputc( )
int fputc(char ch,FILE *fp);
功能:把字符ch写入文件指针fp所指向文件的位置 成功时返回字符的ASCLL码,失败时返回、EOF(在stdio.h中,符号常量EOF的值等于-1)。
FILE *fp;
fputc('a',fp); //把字符a写入fp所指向的文件中。
4.2.字符串读写函数
读字符串函数 fgets()
char *fgets(char *str,int n,FILE *fp);
功能:在文件指针fp所指文件位置读取n个字符并放入str字符数组中。如果读不到字符串,则返回NULL。
FILE *fp;
char str[10];
fp=fopen("e:\\code\\test.txt", "rt");
while ((fgets(str, 10, fp) != NULL)
printf("%s",str); //从fp所指的文件中读取10个字符送入字符数组str中
写字符串函数 fputs()
int fputs(char *str,FILE *fp);
功能:将字符串str写入文件指针fp所指文件的位置。写入数据成功时返回非0值,写入失败时返回EOF。其中,字符串.str.可以是字符串常量,也可以是字符数组名或指针变量。
例如:
FILE *fp;
char str[10];
fp=fopen("e:lcodel\test.txt","rt");
gets(str);
fputs(str,fp); //把字符串str中的内容写入文件指针 fp所指的文件中
4.3.格式化字符串读写函数
格式化字符串读函数fscanf():
int fscanf(FILE *fp,”格式化字符串”,输入项地址表);
功能:从文件指针fp所指向的文件中按照格式字符串指定的格式,将文件中的数据送到输入项地址表中。若读取数据成功则返回所读取数据的个数,并将数据按照指定格式存入内存中的变量或数组中,文件指针自动向下移动;/若读取失败则返回EOF。
fscanf(fp,"%s %s %s", num, name, sex)
格式化字符串写函数fprintf()
int fprintf(FILE *FP,"格式化字符串”,输出项地址表);
功能:将输出项表中的变量值按照格式字符串指定的格式输出到文件指针fp所指向的文件位置。
fprintf(fp,"%s %s %s",num,name,sex);
4.4数据块读写操作
数据块读函数 fread()
int fread(void *buffer,int size,int count,FILE* fp);
功能:从文件指针fp所指文件的当前位置开始,读入size个字节,重复count次,并将读取到的数据存到buffer开始的内存区中,同时将读写位置指针后移size*count次。该函数的返回值是实际读取的count值。
float fa[5];
fread(fa, 4, 5, fp);//从fp 所指的文件中,每次读4个字节(一个实数)送入实型数组fa中,连续读5次,即读5个实数到fa中。
2) 数据块写函数 fwrite( )
int fwrite(void *buffer,int size,int count, FILE* fp);
功能:从buffer所指向的内存区开始,一次输出size个字节,重复count次,并将输出的数据存入到fp所指的文件中,同时将读写位置指针后移size*count次。
float fa[5];
fwrite(fa, 4, 5, tp); //从fa实型数组中,每次读4个字节(一个实数)写入fp所指的文件中,连续读写5次,即将5个实数写到fo所指的文件中。
文件的随机读写
在实际问题中常要求只读写文件中某一指定的部分。为了解决这个问题,可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。实现文件随机读写的关键是按要求移动位置指针,这称为文件的定位。
1.函数 rewind( )
void rewind(FILE *fp);
功能:将文件内部的位置指针移到文件的开始位置。
2. 函数 fseek()
int fseek(FILE *fp, long offset,int whence);
功能:文件指针由whence地址移到offset的地址。
rewind(fp);
fseek(fp, sizeof(struct stu)*n, 0);
fread(&student, sizeof(struct stu), 1, fp);
//把文件指针由0地址往后移sizeof(struct stu)*n地址,即表示文件指针后移n个数据记录的地址,读出当前文件指针所指的数据给student。
3.函数ftell()
函数 ftell)的作用是得到流式文件的当前位置,用相对于文件开头的位移量来表示。由于文件中的位置指针经常移动,人们往往不容易知道其当前位置。用fell函数可以得到当前位置。如果ftell函数返回值为-1L,则表示出错。
i = ftell(fp);
if(i = -1L)
printf("Error!\n");
//变量i存放在当前位置,如调用函数出错(如不存在此文件),则输出“Error!”。