所谓缓冲输入输出,即是进行文件I/O时,以块的倍数或者约数大小为单位进行输入输出,保证每次I/O都是块对齐的,从而提高程序的执行效率,为了是每次的输入输出数据大小都是块的大小的倍数或者约数,就必须对数据进行缓冲来实现,所以叫作缓冲I/O。
c标准库的文件输入输出函数都是基于缓冲的,程序中合理利用标准库进行输入输出不仅可以避免不必要的错误,还可以提高效率。
常见的c标准库文件输入输出函数有:
一下函数都在头文件<stdio.h>中声明,所以使用时必须包含该头文件。
1 打开文件
函数原型: FILE * fopen(const char * file, const char * mode);
参数说明:
file是要打开的文件,比如:“eric/test”;
mode是打开文件的方式,有一下六种取值
“r” : 以读的方式打开文件,流定位在文件的开头,指定的文件如果不存在,则出现错误;
"r+": 以读写的方式打开文件,流定位在文件的开头,指定的文件如果不存在,则出现错误;
"w": 以写的方式打开文件,流定位在文件的开头,指定的文件如果不存在,则创建该文件,如果文件存在,写之前会先被清空;
"w+":以读写的方式打开文件,流定位在文件的开头,指定的文件如果不存在,则创建该文件,如果文件存在,写之前会先被清空;
"a": 以追加写模式打开文件,流定位在文件的结尾,指定的文件如果不存在,则创建该文件;
"a+":以追加读写模式打开文件,流定位在文件的结尾,指定的文件如果不存在,则创建该文件;
返回值:
成功执行返回打开的文件对应的文件指针,错误时返回NULL。
2 关闭文件
函数原型:int fclose(FILE * stream);
参数说明:stream是要关闭的文件指针
返回值:
成功执行返回0,错误时返回EOF。
3 读文件
(1)单字节读取
函数原型:int fgetc(FILE * stream);
参数说明:stream是已经以可读方式打开的文件的文件指针
返回值:
成功执行返回读出的字符对应的int 值,遇到文件结束或者错误时都返回EOF。
(2)读取串
函数原型: char * fgets(char * buf, int size,FILE * stream);
参数说明:stream是已经以可读方式打开的文件的文件指针,读出size-1个字节,存放在buf中,后面加'/0'.
返回值:
成功执行返回buf,错误时返回NULL。
(3)读二进制文件
函数原型: size_t fread(void * buf,size_t size,size_t nr, FILE * stream);
参数说明:stream是已经以可读方式打开的文件的文件指针,读出nr个大小为size的数据,存放在buf中.
返回值:
一般返回nr ,遇到文件结束或者发生错误会返回比nr小的值。
4 写文件
(1)单字节写
函数原型:int fputc(int c,FILE * stream);
参数说明:stream是已经以可写方式打开的文件的文件指针,c 是要写的字符
返回值:
成功执行返回写出的字符对应的int 值,错误时都返回EOF。
(2)写字符串
函数原型:int fputs(const char * str,FILE * stream);
参数说明:stream是已经以可写方式打开的文件的文件指针,str是要写的字符串
返回值:
成功执行返回非负整数,错误时都返回EOF。
(3)写二进制文件
函数原型:size_t fwrite(void * buf,size_t size,size_t nr, FILE * stream);
参数说明:stream是已经以可写方式打开的文件的文件指针,从buf中拿nr个大小为size 的数据写入流。
返回值:
成功执行返回nr,错误时都返回小于nr的值。
5 流定位
(1)
函数原型:int fseek(FILE * stream,long offset,int mode);
参数说明:stream是已经打开的文件的文件指针.
mode可有如下取值:
SEEK_SET: 此时流被定位到offset指定的值
SEEK_CUR:此时流被定位到当前值加上offset处
SEEK_END: 此时流被定位到文件末尾加上offset处
返回值:
成功执行返回0,错误时都返回-1。
(2)
函数原型:void rewind(FILE * stream);
参数说明:stream是已经打开的文件的文件指针.
注意该函数的错误处理
返回值:
无返回值
6 获得流当前位置
函数原型:long ftell(FILE * stream);
参数说明:stream是已经打开的文件的文件指针.
返回值:
成功执行返回流当前位置,错误时都返回-1。
7 清洗流
函数原型:int fflush(FILE *stream);
参数说明:stream是已经打开的文件的文件指针.
该函数将用户缓冲区数据清洗到内核空间,如果stream为NULL,则进程打开的所有流都会被清洗。
返回值:
成功执行返回0,错误时都返回EOF。
8 文件错误和文件结束
int ferr(FILE *stream);
int feof(FILE *stream);
void fclearerr(FILE * stream);
9 文件加锁与解锁,实现更大范围的原子操作
void flockfile(FILE * stream);
void funlockfile(FILE * stream);
以上函数都会在遇到错误是设置errno的值,可以借助它进行错误判断。
缓冲输入输出
最新推荐文章于 2023-07-23 08:59:21 发布