一、文件基本操作
1、建立打开文件
2、从文件中读取数据或写入数据
3、关闭文件
二、打开文件函数
fopen函数原型
FILE *fopen(char *filename,char *mode);
使用mode模式打开一个指定的文件filename文件。
若打开成功返回一个NULL类型的指针,打开失败则返回NULL
注意:
1、第一个参数filename用来表示要打开的文件,如果打开的文件与程序文件的路径相同,可以直接用文件名字;如果程序文件和要打开的文件不在同一个文件夹下,那么要通过完整的路径和完整的文件名来打开。
2、第二个参数是打开文件的方式,必须为字符串格式,所以必须要用双引号扩起来。
3、打开一个文件要给编译系统三个信息:a、访问的文件名 b、使用文件的方式读还是写 c、让哪一个指针变量指向被打开的文件
r:read;
w:write;
a:append
b:binary(二进制)
三、关闭文件函数
fclose函数原型
int fclose(FIL *fp);
将文件指针fp所指向的文件关闭。返回值为0表示关闭成功;若不是0则关闭失败。
注意:
若果采用读的模式打开文件,那么不必关闭文件操作,若是通过写的模式必须要用fclose关闭,否则最后放在缓冲区的数据不能写回文件,会导致数据丢失。在进行文件的读操作的时候,是将磁盘文件中的一块一块的数据送到内存中的缓冲区,装满缓冲区后才根据需求从缓冲区中取出所需数据送给变量进入对应的内存单元。而写的话是将写入的数据首先进入缓冲区,待缓冲区被填满后再送入磁盘文件中,如果程序结束了缓冲区没有被填满,那么不使用fclose强行关闭的话,数据是没有进入磁盘的,所以必须使用fclose强制系统将数据送到磁盘。
四、获取文件属性的函数
打开文件的时候,系统会自动付给文件一个文字描述,在程序中用文字描述代替文件名
1、文件的文字描述
int fileno(FILE *fp);
返回所打开文件指针fp对应的文件描述字(handle_no)。打开成功后给文件一个号码,用这个号码来代表所打开代表文件
2、文件的大小
long filelength(int handle_no);
返回文件描述字(handle_no)对应的文件大小,以字节为单位。
例如:
FILE *fp;
int fno,fsize;
fp=fopen("1.txt","rt");
fno=fileno(fp);
fsize=filelength(fno);
fclose(fp);
五、顺序读写函数
(一)、单字符读写函数
1、单字符读fgetc函数
int fgetc(FILE *fp);
读取文件指针fp目前所指文件位置中的字符,每次读取一个字符,然后文件指针自动往下移动一个位置,文件指针到达文件结尾的时候返回-1.
注意:读取的文件必须以读或者读写的方式打开(r,+)
读取的字符可以赋给字符形变量或者不赋
2、单字符写入函数fpubatc
int fputc(char ch,FILE *fp)
把字符ch写入文件指针fp所指的文件中,成功返回字符的ASCII码,失败返回EOF(stdio.h文件中,符号常亮EOF的值为-1)
注意:
a、写入的字符可以用写或者读写追加的方式打开,用写或者读写方式打开一个已经存在的文件,会将清楚原来文件内容,写入字符从文件首开始。若果要保留原来的内容,希望写入的字符从文章最后开始存放,要用追加的方式打开文件。
b、每次写入一个字符,文件内部位置指针向后移动一个字节。
(二)、字符串读写函数
1、读字符串函数fgets()
char *fgets(char *str,int n,FILE *fp)
将从fp所指向的文件中读取n个字符,将其赋给字符数组str中,若读不到字符串就返回NULL
2、写字符串函数fprintf()
int fputs(char *str,FILE *fp)
将字符串str写入文件指针fp所指的位置,写入成功则返回非0值,写入失败返回EOF
(其中可以是字符串常量也可以是字符数组名或者指针变量)
(三)、格式化字符串读写函数
1、格式化字符串读函数fscanf()
int fscanf(FILE *fp,"格式化字符串",【输入项地址表】)
从文件指针fp所指向的文件中按照格式字符串指定的格式将文件中的数据送给输入项地址表中。若读取数据成功则返回所读数据的个数,病将数据按照指定格式存入内存中的变量或者数组中,文件指针往下移动,失败则返回EOF
2、格式化字符串写函数fprintf()
int fprintf(FILE *fp,"格式化字符串",【输入项地址表】)
将输出项表中的变量按照格式字符串指定的格式输出到文件指针所指向的文件位置。
注意:如果输入的字符串没有空格,那么格式化字符串读写不会出错。但是当输入的字符串中带有空格时候,虽然向文件中写入的数据依然正确,但是读取的时候会发生错误,因为当fscanf()函数在读取的时候,是以空格作为数据与数据之间的间隔。
(四)、数据块读写操作
1、数据块读函数fread()
int fread (void *buffer,int size,int count,FILE* fp)
从文件指针指向的文件的当前位置开始,一次读入size个字节,重复count次,并且将读到的数据存到buffer开始的内存中,然后读写指针位置指针向后移动size×count个字节
注意:buffer是一个指针,在fread函数中,它表示存放读入数据的首地址。
fp所指向文件读出到变量
2、数据块写函数fwrite()
int fwrite(void *buffer,int size,int count,FILE* fp)
从buffer所指的内存开始,一次输出size个字节,重复count次,并将输出的数据存入fp所指向的文件中,同时将读写位置指针后移动size×count个字节
注意:buffer是一个指针,在fwrite函数中,它表示写出数据的首地址。
从变量写入fp所指向的文件。
六、文件的随机读取
可以移动文件内部的位置指针到需要读写的位置,再进行读写。
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);
fwrite(&student,sizeof(strcut stu),1,fp);
把文件指针内部的位置指针指回文件开始的位置,将文件指针由0地址后移动到n个结构体的长度地址,将student中的数据写入长度为一个结构体的当前文
件指针所指向的数据中,重复一次。
3、ftell()函数
ftell()函数是得到流式文件的当前位置,用相对于文件开头的位移量来表示。由于文件中的位置指针经常移动,不知道当前位置,用该函数能够得到当前位置。如果函数返回值为-1L表示出错。
4、其他读写函数
putw(10,fp);
作用是将整数10写入fp所指向的文件
i = getw(fp);
作用是从磁盘文件中读一个整数到内存并且赋值给变量i
注意:putw和getw不是ANSI C标准定义的函数。
七、出错检查
1、feof()函数
int feof(FILE *fp)
判断文件指针fp是否处于文件的结束位置,如果文件指针结束,返回值为1,否则返回0.
2、ferror()函数
int ferror(FILE *fp)y
ui检查文件在用各种输入、输出函数进行读写时候是否出错,
返回值为0表示没有出错。
注意:
对于同一个文件每一次调用输入输出函数,均产生一个新的ferror函数值,因此应当执行fopen函数的时候,ferror函数的初始值自动为0.
3、clearerr()函数
int clearerr(FILE *fp)
本函数用于清除出错标志和文件结束标志,使它们为0。将设调用一个输入输出函数时候出现错误,ferrror函数值就会返回一个非0值,在调用clearerr(fp)后,ferror(fp)的值为0。只要出现一个出错标志,就会一直保留,直到同一个文件调用clearerr函数或者rewind函数,或者任何其他一个输入输出函数。