- gets与fgets对比
都包含自头文件stdio.h
char *gets(char *str)
char *fgets(char *str, int n, FILE *stream)
- gets(buf) 只能从键盘输入(stdin)
而fgets(buf,n,file),从各种文件中读(stdin和普通文件都可) - gets不安全,fgets安全,预防缓冲区溢出
-
在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)
- gets的读取遇到EOF(文件结束),回车,长度满时停止;fread遇到EOF(文件结束),长度满时停止.所以fgets一次读一行,fread一次读一块
- fgets(fputs)用于文本文件操作;fread(fwrite)用于二进制文件操作。
- fread 和read的对比
此处涉及到文件读写的两种操作:带缓冲区和不带缓冲区
- fread是c库文件<stdio.h>;read是系统调用<unistd.h>
- fread是有缓冲读写,高效;read是无缓冲区读写
- fread操作文件流(FILE*);read操作文件描述符
- 为什么快?:带缓冲区的读写,原理类似cache,因为多次访问磁盘文件很慢(每次都要陷入内核),所以就先向缓冲区里写,写满了调用一次系统调用(陷入内核)向磁盘写,所以减少了系统调用的次数。
- 注意:这个缓冲区与函数参数中的指针所指的buf可不一样,此缓冲区是C库实现的,对我们透明,但是要知道原理
- 为了支持这个机制,C库封装了文件流和缓冲区。
- 文件流:FILE*: 封装了不同OS对文件的实现,
- 封装了缓存支持和优化。
关于文件流和文件缓冲可见博客https://www.cnblogs.com/lasnitch/p/12764120.html
网友评论