美文网首页
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