一类:行缓存 ,遇到换新行(\n),或者写满缓存时,即调用系统调用函数
- 读:fgets,gets,printf,fprintf,sprintf
- 写:fputs,puts,scanf
二类:无缓存 只要用户调这个函数,就会将其内容写到内核中
stderr
三类:全缓存 只有写满缓存再调用系统调用函数
- 读:fread
- 写:fwrite
行缓存的读写函数fgets和fputs
char *fgets (char *s, int size,FILE *stream)
- 第一个参数:缓存,即读到哪里去
- 第二个参数:读多少个字节
- 第三个参数:从什么地方读
- 返回值:若成功则为s(缓存的地址),若已处文件尾端或出错则为null
int fputs(const char *s,FILE *stream);
- 第一个参数:缓存,即写什么内容
- 第二个参数:写到哪里去
- 若成功则为非负值,若出错则为EOF -1 。
注:前面说:“行缓存 ,遇到换新行(\n),或者写满缓存时,调用系统调用函数。”在这并没有达到前两个要求,是因为fclose的作用---关闭一个文件流,使用fclose就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。
注: 这里之所以加上fseek移动光标至writeBuff的头部,是因为fputs读取时本身有偏移量,在写入时,本身光标指针偏移到了最后面。
刷新缓存函数
fluash(FIFE *fp) --- 把库函数中的缓存内容强制写到内核中。
调整读写位置指针函数:
fseek()参数与lseek是一样的但是返回值不一样
lseek的返回值是:当前文件的位置指针值;
- fseek()的返回值是:成功返回0,失败返回-11;
- rewind(FILE *fp) 用于设定流的文件位置指示为文件开始,该函数调用成功无返回值。
- rewind()等价于(void)fseek(fp 0, SEEK_SET);
- ftell(FILE *fp)
用于取得当前的文件位置,调用成功则为当前文件位置指示,若出错则为-1L;
行缓存的读写函数gets和puts
char *gets(char*s);
int puts(constchar *s);
gets 与fgets的区别:
- gets()时不能指定缓存的长度,这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空 间中,从而产生不可预料的后果;
- gets()只能从标准输入中读;--- stdout中
- gets()与fgets()的另一个区别是:gets()并不将新行符存入缓存中, fgets 将新行符存入缓存中;
puts 与fputs的区别:
- puts()只能向标准输出中写;
- puts()与fputs()的另一个区别是: puts 输出时会添加一个新行符,fputs不会添加;
fprintf、printf、sprintf 行缓存的函数
- int fprintf(FILE *stream,”字符串格式”)
- fprintf可以输出到文件中,也可输出到显示器, printf 只能输出到显示器中。
- intsprintf(str *, “字符串格式”) 输出内容到一个字符串中