从零开始一起学C语言(七)---文件操作
目录
1、缓冲区文件
前面编写程序没有真正的存储数据,要想存储数据就涉及到文件操作。文件操作可分为两种方法:基于缓冲区的文件操作、基于非缓冲区的文件操作。标准c的文件操作是基于缓冲区的文件操作。
2、文件操作指针介绍
每个被使用的文件都会在内存中开辟一个区,这个区叫做内存缓冲区,用来存放文件的
有关信息(如文件名、文件状态、文件当前位置等等)。这些信息保存在一个结构体变量中,
该结构体类型由系统定义,名字为 FILE。在头文件 stdio.h 中有该结构体的声明。
FILE 结构体定义如下:
typedef struct
{
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(即是文件的起始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //文件的大小
char *_tmpfname; //临时文件名
}FILE;
正常情况下我们操作文件就是操作该结构体内部的元素,但这样太过麻烦,于是标准c封装好了所有操作文件的函数供我们调用,我们直接调用这些函数就可以了。
3、打开关闭函数
·函数原型:FILE *fopen(char *name, char *mode);
·功能:按指定的方式 mode 打开文件名为 name 的文件。
·返回值:正常打开,返回指向文件结构体的指针;打开失败,返回 NULL。
参数1 name:路径。两种表示方法:绝对路径 “d:\\1.txt” ;相对路径 “1.txt” 。
参数2
关闭函数:
·函数原型:int fclose(FILE* fp);
·功能:关闭 fp 所指向的文件
·返回值:正常关闭返回 0;出错时,返回非 0
·使用方法:fclose(fp);
4、单个字符的读写
fputc
函数原型:int fputc(int c, FILE *fp);
功能:把一字节代码 c 写入 fp 指向的文件中
返回值:正常,返回 c;出错,为 EOF(-1)
fgetc
函数原型:int fgetc(FILE *fp);
功能:从 fp 指向的文件中读取一字节代码
返回值:正常,返回读到的代码值;读到文件尾或出错,为 EOF(-1)
feof
函数原型:int feof(FILE *fp);
功能:判断文件是否到末尾
返回值:文件未结束,返回 0;文件结束,返回真(非 0)
5、文件指针定位
rewind 函数
函数原型: void rewind(FILE *fp)
功能:重置文件位置指针到文件开头
返回值:无
fseek 函数
函数原型: int fseek(FILE *fp,long offset,int whence)
功能:文件随机定位函数,改变文件位置指针的位置。一般用于二进制文件。
返回值:成功,返回 0;失败,返回非 0 值
Eg: fseek(fp,100L,0);
fseek(fp,50L,1);
fseek(fp,-10L,2);
第 2 个参数 offset 表示相对 whence 为基点的偏移字节数,要求是长整型数据,可以是正整数(向文件尾方向移动)、0(不移动)、负整数(向文件头方向移动)。
第 3 个参数可以用如下的宏替换:
文件开始 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
6、字符串读写
char *fgets(char *s, int n, FILE *fp)
int fputs(char *s, FILE *fp)
功能:
fgets:从 fp 指向的文件中读一个长度为 n 的字符串,保存到 s 中。其中 char* s 要是已经有内存空间的,通常是用数组定义的,或者用 char*则要用 malloc 分配内存。
fputs:向 fp 所指向的文件中写入字符串 s。
返回值:
fgets:正常时返回读取字符串的首地址;出错或文件尾,返回 NULL
fputs:正常时返回写入的最后一个字符;出错为 EOF(-1)
7、块读块写
函数原型:
size_t fread(void *buffer,size_t size, size_t count, FILE *fp);
size_t fwrite(void *buffer,size_t size, size_t count, FILE *fp);
功能:读/写数据块 fread 与 fwrite 一般用于二进制文件的输入/输出
fread:从 fp 所指向的文件中读取 count 个块,每个块的长度为 size 个字节,存放
到以 buffer 为首地址的内存中。其中 buffer 必须已经是有内存空间的。
fwrite:从以 buffer 为首地址的内存中读取 count 个块,每个块的长度为 size 个字
节,写入到 fp 所指向的文件中。
返回值:1 成功,返回读/写的块数;出错或文件尾,返回 0
说明:
buffer: 指向要输入/输出数据块的首地址的指针
size: 读/写的数据块的大小(字节数)
count: 要读/写的数据块的个数
fp: 要读/写的文件指针
8、格式化读写
函数原型:
int fprintf(FILE *fp,const char *format[,argument,„])
int fscanf(FILE *fp,const char *format[,address,„])
功能:按格式对文件进行读写操作。二进制的文件不要用,而改用 fread 和 fwrite。
fprintf:输出列表中的各项数据按指定的格式写入到 fp 指向的文件中
fscanf:从 fp 所指向的文件中按指定的格式读取数据依次存放到输出列表中的各项。
返回值:成功,返回读写的个数;出错或文件尾,返回 EOF(-1) ,eg:
fprintf(fp,“%d,%6.2f”,i,t); //将 i 和 t 按%d,%6.2f 格式输出到 fp 文件
fscanf(fp,“%d,%f”,&i,&t); //若文件中有 3,4.5 ,则将 3 送入 i, 4.5 送入 t
9、其他函数
ftell 函数
函数原型: long ftell(FILE *fp)
功能:返回位置指针当前位置(用相对文件开头的位移量表示)
返回值:成功,返回当前位置指针位置(长整型) ;失败,返回-1L,
remove 函数
函数原型: int remove(char* path)
功能:删除指定路径的文件
返回值:成功删除,0;否则,-1