标准I/O库之每次一行I/O
2014-01-05 11:24
309 查看
下面两个函数提供每次输入一行的功能。
这两个函数都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets则从指定的流读。
对于fgets,必须指定缓冲区的长度n。此函数一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符(包括换行符)被送入缓冲区。该缓冲区以null字符结尾。如若该行(包括最后一个换行符)的字符数超过n-1,则fgets只返回一个不完整的行,但是,缓冲区总是以null字符结尾。对fgets的下一次调用会继续读该行。
gets是一个不推荐使用的函数。其问题是调用者在使用gets时不能指定缓冲区的长度。这样就可能造成缓冲区溢出(如若该行长于缓冲区长度),写到缓冲区之后的存储空间中,从而产生不可预料的结果。gets与fgets的另一个区别是,gets并不将换行符存入缓冲区中。
这两个函数处理换行符方面的差别与UNIX系统的演进有关。早在V7的手册(1979年)中就说明:“为了向后兼容,gets删除换行符,而fgets则保持换行符。”
即使ISO C要求实现提供gets,但请使用fgets,而不要使用gets。
fputs和puts提供每次输出一行的功能。
函数fputs将一个以null符终止的字符串写到指定的流,尾端的终止符null不写出。注意,这并不一定是每次输出一行,因为它并不要求在null符之前一定是换行符。通常,在null符之前是一个换行符,但并不要求总是如此。
puts将一个以null符终止的字符串写到标准输出,终止字符不写出。但是,puts然后又将一个换行符写到标准输出。
puts并不像它所对应的gets那样不安全。但是我们还是应避免使用它,以免需要记住它在最后是否添加了一个换行符。如果总是使用fgets和fputs,那么就会熟知在每行终止处我们必须自己处理换行符。
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。
#include <stdio.h> char *fgets( char *restrict buf, int n, FILE *restrict fp ); char *gets( char *buf ); 两个函数返回值:若成功则返回buf,若已到达文件结尾或出错则返回NULL
这两个函数都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets则从指定的流读。
对于fgets,必须指定缓冲区的长度n。此函数一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符(包括换行符)被送入缓冲区。该缓冲区以null字符结尾。如若该行(包括最后一个换行符)的字符数超过n-1,则fgets只返回一个不完整的行,但是,缓冲区总是以null字符结尾。对fgets的下一次调用会继续读该行。
gets是一个不推荐使用的函数。其问题是调用者在使用gets时不能指定缓冲区的长度。这样就可能造成缓冲区溢出(如若该行长于缓冲区长度),写到缓冲区之后的存储空间中,从而产生不可预料的结果。gets与fgets的另一个区别是,gets并不将换行符存入缓冲区中。
这两个函数处理换行符方面的差别与UNIX系统的演进有关。早在V7的手册(1979年)中就说明:“为了向后兼容,gets删除换行符,而fgets则保持换行符。”
即使ISO C要求实现提供gets,但请使用fgets,而不要使用gets。
fputs和puts提供每次输出一行的功能。
#include <stdio.h> int fputs( const char *restrict str, FILE *restrict fp ); int puts( const char *str ); 两个函数返回值:若成功则返回非负值,若出错则返回EOF
函数fputs将一个以null符终止的字符串写到指定的流,尾端的终止符null不写出。注意,这并不一定是每次输出一行,因为它并不要求在null符之前一定是换行符。通常,在null符之前是一个换行符,但并不要求总是如此。
puts将一个以null符终止的字符串写到标准输出,终止字符不写出。但是,puts然后又将一个换行符写到标准输出。
puts并不像它所对应的gets那样不安全。但是我们还是应避免使用它,以免需要记住它在最后是否添加了一个换行符。如果总是使用fgets和fputs,那么就会熟知在每行终止处我们必须自己处理换行符。
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。
相关文章推荐
- 电子商务王闯教你找回QQ原来手机图标
- ZOL上,下载的这个嵌入版本如何使用
- 通过yum下载rpm包
- vi编辑器__(3)插入模式
- 12306 糟糕的网站架构和实现
- 部署cobbler自动化安装系统
- 用VS2010+cocos2d-x 2.0.3编写游戏,并将游戏部署到Android手机上
- linux apche + resin重启后,网页依旧打不开的解决方案
- 玩转CSLA.NET小技巧系列二:使用WCF无法上传附件,提示413 Entity Too Large
- 没有spring如何使用注解下篇
- linux服务器磁盘扩容的方法(图)
- vi编辑器__(2)末行模式
- some linux kernel parameters tune
- OpenGL多视口
- Box2d形状编辑器
- vi编辑器__(1)命令模式
- Popular HashMap and ConcurrentHashMap interview questions
- 内核启动过程的配置
- window 7旗舰版与ubuntu 13.04双系统 启动项
- String 内存问题