行缓存:和终端相关的读写操作指针对应的缓冲区称为行缓存(stdin、stdout),大小为1024字节
全缓存:和文件相关的读写操作指针对应的缓冲区称为全缓存(fp),大小为4096字节
不缓存:和标准出错输出流相关的文件指针对应的缓冲区(stderr),大小为0
行缓存刷新时机
全缓存刷新时机
#include
int fflush(FILE *stream);
功能:刷新指定的文件指针的缓冲区
参数:要刷新的缓冲区文件指针
返回值:成功返回0,失败返回EOF,并置位错误码
不缓存的刷新时机
int fprintf(FILE *stream, const char *format, ...);
功能:向指定的文件中,输出指定的格式串
参数1:要被输出的文件
参数2:格式串,可以包含格式控制符
参数3:不定参数,根据参数2中的格式控制符而定
返回值:成功返回输出的字符个数,失败返回EOF
int fscanf(FILE *stream, const char *format, ...);
功能:从给定的文件中,以指定的格式,读取数据到程序中来
参数1:指定的文件指针
参数2:格式串,可以包含格式控制符
参数3:不定参数,根据参数2中的格式控制符而定
返回值:成功返回写入数据的个数,失败返回一个负数,并置位错误码
#include
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从stream指向的文件中读取nmemb项数据,每一项的大小为size,将数据存储在ptr指向的空间中
参数1:存放数据的起始地址
参数2:每一项的大小
参数3:读取数据的总项数
参数4:要被读取的文件
返回值:成功返回读取的项数,失败返回一个小于项数的值 注意:fread出错时,并不能区分是因为文件读取结束还是程序调用出错,需要使用feof或ferror来判断
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:将ptr指针指向的空间中,以每项大小为size字节,的nmemb项数据,写入到stream指向的文件中
参数1:要写入的数据起始地址
参数2:每一项的大小
参数3:写入数据的总项数
参数4:要被写入的文件
返回值:成功返回写入的项数,失败返回返回一个小于项数的值,或者是0
由于fread出错时,不区分到低是文件结束函数调用失败,需要使用对应函数判断
int feof(FILE *stream);
功能:判断给定的文件指针是否已经到文件末尾
参数:文件指针
返回值:如果到达文件末尾返回值真,否则返回假
int ferror(FILE *stream);
功能:判断文件指针使用是否出错
参数:文件指针
返回值:如果出错返回值真,否则返回假
int fseek(FILE *stream, long offset, int whence);
功能:将指定的文件指针从指定的位置处开始偏移
参数1:文件指针
参数2:偏移量 >0:表示向后偏移
=0:表示不偏移
<0:表示下向前偏移
参数3:偏移的起始位置
SEEK_SET:文件起始位置
SEEK_CUR:文件当前位置
SEEK_END:文件结尾位置
返回值:成功返回0,失败返回-1并置位错误码
long ftell(FILE *stream);
功能:返回当前光标所在位置
参数:文件指针
返回值:当前文件指针所在位置,失败返回-1,并置位错误码
void rewind(FILE *stream);
功能:将光标重新定位在开头 : fseek(fp,0,SEEK_SET)
参数:文件指针
返回值:无
文件io是不带缓存的io,每次调用都要用到内核中的系统调用,效率较低。
标准io依赖库函数,程序提供的函数,该函数封装了一个缓冲区 ,将要操作的数据放入缓冲区,待达到 刷新时机后,再调用系统调用函数,统一刷入内核,效率较高
i :input o:output
程序与外部设备传递信息的过程
FILE是stdio.h中自带的结构体,结构体描述了文件所有信息,用 fopen函数打开一个文件所返回的
值就是文件指针
结构体包含两部分:缓冲区大小,用于标准io;文件描述符,用于文件io
文件io需要用到系统调用,依赖内核提供的函数 ,从用户空间向内核空间进行切换,效率较低
遍历所有单向链表的节点,判断有没有多次使用同一地址,有代表出现环
1.使用fread、fwrite完成两个文件的拷贝
2.将注册登录框架重新实现一遍
3.完成图像文件信息的读写操作