自学内容网 自学内容网

linux文件IO 缓存,行缓存,三类读写函数,fprint,sprintf等

文件IO与标准IO的区别:

Linux标准文件描述符:

可以和printf一样的输出效果;

  • 文件IO:是直接调用内核提供的系统调用函数,头文件是unistd.h。之前的open,close等。
  • 标准IO:是间接调用系统调用函数。头文件是stdio.h。fopen,fwrite。
    • 之前学的输入输出的相关的函数。都是和标准的输入如:gets、scanf、getchar等。这些函数不能读写文件。
    • 而标准IO中的相关函数,不仅能够读写普通文件,也可以向标准的输入或者标准的输出进行读和写。

缓存:

  1. 我们程序中的缓存,就是你想从内核读取的缓存(数组) ——————用户空间的缓存。
  2. 我们每打开一个文件,内核在内核空间中就会开辟一块缓存,这个叫内核空间的缓存。            文件IO中的写即是将用户空间的缓存写到内核空间的缓存中去,                                              文件IO的读即是将内核空间的缓存写到用户空间的缓存中去。
  3. 标准IO的库函数也有一个缓存,这个缓存成为——库缓存。

c库缓存的特点:

  1. 遇到\n时,会将库函数的内容写到内核缓存中,即调用了系统调用函数。
  2. 库缓存写满时会调用系统调用函数,将库函数的内容写到内核缓存中去。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的区别:

  1.         gets()时不能指定缓存的长度,这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空 间中,从而产生不可预料的后果;
  2. gets()只能从标准输入中读;
  3. gets()与fgets()的另一个区别是:gets()并不将新行符存入缓存中, fgets 将新行符存入缓存中;

puts 与fputs的区别:

  1. puts()只能向标准输出中写;
  2. puts()与fputs()的另一个区别是: puts 输出时会添加一个新行符,fputs不会添加;

在实际编程中,推荐使用 fgetsfputs,因为它们更安全,提供了对缓冲区大小的控制,从而避免了潜在的缓冲区溢出问题。而 getsputs 由于安全性和功能性的限制,应该避免使用,尤其是在处理来自用户的数据时。

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);

  • 功能:清除流错误
  • 参数:文件流


原文地址:https://blog.csdn.net/2301_77071575/article/details/142319421

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!