美文网首页
c中fgets,gets,fread,read的区别

c中fgets,gets,fread,read的区别

作者: FakeCSer爱去网吧 | 来源:发表于2020-05-12 20:08 被阅读0次
  • gets与fgets对比
    都包含自头文件stdio.h
    char *gets(char *str)
    char *fgets(char *str, int n, FILE *stream)
  1. gets(buf) 只能从键盘输入(stdin)
    而fgets(buf,n,file),从各种文件中读(stdin和普通文件都可)
  2. gets不安全,fgets安全,预防缓冲区溢出
  3. 在stdin输入时gets不会将回车算入,而fgets会将回车也读入缓冲区




    前两行是输入,后两行是输出,可见fgets的字符串多一个回车符


  • fgets 和 fread的对比
    都在头文件 stdio.h中
    char *fgets(char *str, int n, FILE *stream)
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
  1. gets的读取遇到EOF(文件结束),回车,长度满时停止;fread遇到EOF(文件结束),长度满时停止.所以fgets一次读一行,fread一次读一块
  2. fgets(fputs)用于文本文件操作;fread(fwrite)用于二进制文件操作。

  • fread 和read的对比
    此处涉及到文件读写的两种操作:带缓冲区和不带缓冲区
  1. fread是c库文件<stdio.h>;read是系统调用<unistd.h>
  2. fread是有缓冲读写,高效;read是无缓冲区读写
  3. fread操作文件流(FILE*);read操作文件描述符
  • 为什么快?:带缓冲区的读写,原理类似cache,因为多次访问磁盘文件很慢(每次都要陷入内核),所以就先向缓冲区里写,写满了调用一次系统调用(陷入内核)向磁盘写,所以减少了系统调用的次数。
  • 注意:这个缓冲区与函数参数中的指针所指的buf可不一样,此缓冲区是C库实现的,对我们透明,但是要知道原理
  • 为了支持这个机制,C库封装了文件流和缓冲区。

相关文章

网友评论

      本文标题:c中fgets,gets,fread,read的区别

      本文链接:https://www.haomeiwen.com/subject/xqminhtx.html