linux文件IO 缓存,行缓存,三类读写函数,fprint,sprintf等
文件IO与标准IO的区别:
Linux标准文件描述符:
可以和printf一样的输出效果;
- 文件IO:是直接调用内核提供的系统调用函数,头文件是unistd.h。之前的open,close等。
- 标准IO:是间接调用系统调用函数。头文件是stdio.h。fopen,fwrite。
- 之前学的输入输出的相关的函数。都是和标准的输入如:gets、scanf、getchar等。这些函数不能读写文件。
- 而标准IO中的相关函数,不仅能够读写普通文件,也可以向标准的输入或者标准的输出进行读和写。
缓存:
- 我们程序中的缓存,就是你想从内核读取的缓存(数组) ——————用户空间的缓存。
- 我们每打开一个文件,内核在内核空间中就会开辟一块缓存,这个叫内核空间的缓存。 文件IO中的写即是将用户空间的缓存写到内核空间的缓存中去, 文件IO的读即是将内核空间的缓存写到用户空间的缓存中去。
- 标准IO的库函数也有一个缓存,这个缓存成为——库缓存。
c库缓存的特点:
- 遇到\n时,会将库函数的内容写到内核缓存中,即调用了系统调用函数。
- 库缓存写满时会调用系统调用函数,将库函数的内容写到内核缓存中去。1024
三类读写函数
一类:行缓存 ,遇到换新行(\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 。
刷新缓存函数:
fflush(FILE *fp);
把库函数中的缓存直接强制写到内核中。
调整读写位置指针函数:
fessk函数和lseek函数一样但是返回值不一样。
- lseek的返回值是:当前文件的位置指针值;失败时返回
-1
。 - fseek()的返回值是:成功返回0,失败返回-非零值;
rewind()
- rewind(FILE *fp)用于设定流的文件位置指示为文件开始,该函数调用成功无返回值。
- rewind()相当于 void fseek(fp,0,SEEK_SET);
ftell(FILE *fp)
ftell(FILR *fp) 用于获取当前的文件位置,调用成功则为当前文件位置指示,若出错则-1L;
注意这里的光标在fputs之后在fp文件内是在结尾的,加一个fseek使光标回到开头(SET)位置,否则在之后的fgets是读不出内容的。
行缓存的读写函数gets和puts()
char *gets(char*s);
int puts(const char *s);
gets 与fgets的区别:
- gets()时不能指定缓存的长度,这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空 间中,从而产生不可预料的后果;
- gets()只能从标准输入中读;
- gets()与fgets()的另一个区别是:gets()并不将新行符存入缓存中, fgets 将新行符存入缓存中;
puts 与fputs的区别:
- puts()只能向标准输出中写;
- puts()与fputs()的另一个区别是: puts 输出时会添加一个新行符,fputs不会添加;
在实际编程中,推荐使用 fgets
和 fputs
,因为它们更安全,提供了对缓冲区大小的控制,从而避免了潜在的缓冲区溢出问题。而 gets
和 puts
由于安全性和功能性的限制,应该避免使用,尤其是在处理来自用户的数据时。
fprintf、printf、sprintf 行缓存的函数
- int fprintf(FILE *stream,”字符串格式”)
- fprintf可以输出到文件中,也可输出到显示器,
- printf 只能输出到显示器中。
- int sprintf(str *, “字符串格式”)
- 输出内容到一个字符串中
一个字符读写函数fgetc和fputc
不是行缓存的
int fgetc(FILE *fp)
- 功能:从文件中读取一个字符;
- 参数:文件流
- 返回值:正确为读取的字符,到文件结尾或出错时返回EOF。
int fputc(int c, FILE *fp)
- 功能:写一个字符到文件中
- 参数:第一个参数为要写的字符,第二个参数为文件流
- 返回值:成功则返回输入的字符,出错返回EOF。
- 是否是行缓存函数? 证
- 明 fputc有缓存,但不是行缓存函数
EOF是-1;
int feof(FILE *stream);
- 功能:判断是否已经到文件结束
- 参数:文件流
- 返回值:到文件结束,返回为非0,没有则返回0
int ferror(FILE *stream);
- 功能:判断是否读写错误
- 参数:文件流
- 返回值:是读写错误,返回为非0,不是则返回0
void clearerr(FILE *stream);
- 功能:清除流错误
- 参数:文件流