文件操作函数
一.打开文件——fopen函数:
1.函数原型:
FILE *fopen(char *filename,char *mode);
2.函数功能:
使用mode模式打开指定的filename文件。
3.返回值:
如果打开文件成功,返回一个FILE类型的指针;
如果打开失败,返回NULL。
4.参数:
第一个参数filename指打开的文件名。
若打开的文件与执行文件路径相同(即同一文件夹),
只写文件名即可。
如若不在同一路径,则需要指定打开文件的绝对路径。
第二个参数mode指打开的文件类型和指定文件的访问模式。
例如:
FILE *fp;
fp=fopen("test.txt","r");//表示以只读方式打开一个和可执行文件相同路径(同一文件夹)的文本文件test.txt。
也可:
FILE *fp;
fp=fopen("c:/Program Files/test.txt","r");//表示以只读方式打开一个c盘下Program Files文件夹中的文本文件test.txt。
(其中斜杠“/”可以换成两个反斜杠“\\")
注:文件中的访问模式
二.关闭文件——fclose函数:
1.函数原型:
int fclose(FILE *fp);
2.函数功能:
将文件指针fp所指的文件关闭。
3.返回值:
返回0,代表关闭成功;
返回非0,则代表有错误发生。
三.获取文件属性——fileno函数和filelength函数:
打开一个文件时,系统都会自动赋予该文件一个文件描述字(File Handle Number),在程序中若使用该文件描述字来代替对应的文件,就可以在程序中以文件描述字取代该文件的全名。其作用效果相当于#define定义符号常量一样,让引用文件名更为方便,不用多次采用文件名。
1.fileno函数:
1).函数原型:
int fileno(FILE *fp);
2).函数功能:
返回所打开文件指针fp所指文件对应的文件描述(handle_no)。
所在头文件stdlib.h
2.filelength函数:
1).函数原型:
long filelength(int handle_no);
2).函数功能:
返回文件描述字(handle_no)对应的文件大小,以字节为单位。
所在头文件io.h
例:取得e盘下code文件夹下的test.txt文件的大小
FILE *fp;
int fno,fsize;
fp=fopen("e:/code/test.text","r");
fno=fileno(fp);
fsize=filelength(fno);
fclose(fp);
四.顺序读写文件——
单字符读写函数:fgetc和fputc
字符串读写函数:fgets和fputs
格式化读写函数:fscanf和fprintf
数据块读写函数:fread和fwrite
1.单字符读写函数:
(1)读单字符函数——fgetc函数
·函数原型:
int fgetc(FILE *fp);
·函数功能:
读取文件指针fp目前所指文件位置中的字符,
读取完毕,文件指针自动往下移动一个字符位置,
若文件指针已经到文件结尾,返回-1。
例如:ch=fgetc(fp);//其意义是从fp所指文件中读取一个字符并送入ch中
·注意:
调用fgetc函数,文件必须是以读或者读写方式打开的。
在文件内部有一个位置指针。用来指向文件当前读写位置。
文件打开时它指向文件第一个字节使用fgetc后,
该指针自动向后移动一个字节。
文件内部的位置指针用以指示文件内部当前读写的位置,
每读写一次,指针自动向后移动。
而且它并不用定义,是由系统自己设置的。
(2).写单字符函数——fputc函数
·函数原型:
int fputc(char ch,FILE *fp);
·函数功能:
把字符ch写入文件指针fp所指文件的位置,
成功是返回字符的ASCII码,
失败时返回EOF(在stdio.h中符号常量EOF的值等于-1)
例如:
FILE *fp;
fputc('a',fp);//其意义是把字符写入fp所指向的文件中
·注意:
调用fputc函数,文件打开方式包含写入
每写一个字符,文件内部位置指针自动向后移动一个字节。
fputc函数的返回值,如果成功写入,就返回写入的字符,
否则返回一个EOF。
2.字符串读写函数:
(1).读字符串函数——fgets函数
·函数原型:
char *fgets(char *str,int n,FILE *fp);
·函数功能:
在文件指针fp所指文件位置读取n个字符并放入str字符数组中。
如果读取不到就返回NULL。
例如:
FILE *fp;
char str[10];
fgets(str,10,fp);
(2).写字符串函数——fputs函数
·函数原型:
int fputs(char *str,FILE *fp);
·函数功能:
将字符串str,写入文件指针fp所指文件的位置。
写入成功时返回非0,写入失败时返回EOF。
例如:
FILE *fp;
char str[10]={0,1,2,3,4,5,6,7,8,9);
fputs(str,fp);
3.格式化读写函数:
(1).格式化字符串读函数——fscanf函数
·函数原型:
int fscanf(FILE *fp,"格式化字符串”,【输入项地址表】);
·函数功能:
从文件指针fp所指向的文件中按照格式字符串指定的格式
将文件中的数据送到输入项地址表中。
读取成功,会返回读取数据的个数,若失败,返回0。
例如:
char num[20],name[40],sex[5];
FIEL *fp;
fp=fopen("test.txt","r");
fscanf(fp,"%s %s %s",num,name,sex);
(2).格式化字符串写函数——fprintf函数
·函数原型:
int fprintf(FILE *fp,"格式化字符串",【输出项地址表】);
·函数功能:
将输出项表中的变量值,按照格式字符串指定的格式
输出到文件指针fp所指向的文件位置。
例如:
char num[20]={1234567890},name[40]="XX",sex[5]=“sex";
FIEL *fp;
fp=fopen("test.txt","a");
fscanf(fp,"%s %s %s",num,name,sex);
注意:
在字符串读写函数中,空格作为检测标志,它并不能被写入。
那么需要解决空格写入,可以通过fputc函数,fputs函数。
或者通过数据块读写函数。
4.数据块读写函数:(注意:它以二进制文件的方式来写入和输出数据的,Windows直接打开文件是看不到的)
(1).数据块读函数——fread函数:
·函数原型:
int fread(void *buffer,int size,int count,FILE *fp);
·函数功能:
从文件指针fp所指向的文件的当前位置开始,
一次读入size个字节,重复count次,
并将读到的数据存到buffer开始的内存区中,
同时,读写位置指针后移。
返回值就是实际读取的count值。
例如:
float fa[5];
fread(fa,4,5,fp);//从fp所指文件中,每次读取4个字节(一个实数),送入到实型数组fa中,连续五次,即读五个实数到fa中。
(2).数据块写函数——fwrite函数:
·函数原型:
int fwrite(void *buffer,int size,int count,FILE *fp);
·函数功能:
从buffer所指向的内存区开始,一次输出size个字节,
重复count次,并将输出的数据存到fp所指向的文件中,
同时,读写位置指针后移。
例如:
float fa[5];
fwrite(fa,4,5,fp);//从实型数组fa中,每次读4个字节(一个实数),写入fp所指的文件中,连续5次,即写五个实数到fp所指文件中。
五.随机写入文件——rewind函数、fseek函数和ftell函数
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);//把文件指针由0地址,往后移sizeof(struct stu)*n地址,即表示文件指针后移n个数据记录的地址。
3.ftell函数:
·函数原型:
long ftell(FILE *fp);
·函数功能:
得到流式文件的当前位置,
用相对文件开头的位移量(字节)来表示。
如果返回值为-1L,表示出错。
例如:
i=ftell(fp);//获取fp指向的文件的当前读写位置,并将其复制给i。
六.出错检查函数——feof函数、ferror函数和clearerr函数
1.feof函数:
·函数原型:
int feof(FILE *fp);
·函数功能:
判断文件指针fp是否处于文件结束位置。
是->返回1.
否->返回0.
2.ferror函数:
·函数原型;
int ferror(FILE *fp);
·函数功能:
检查文件在各种输入、输出函数进行读写时是否出错。
如果返回值为0,则未出错,否则出错。
3.clearerr函数:
·函数原型:
int clearerr(FILE *fp);
·函数功能:
用于清除出错标志和文件结束标志,使他们的值为0.