fgets函数 和 fputs

转载 2013年12月02日 13:55:10

From: http://blog.csdn.net/wuyu1125/article/details/7610652


fgets从指定的文件中读一行字符到调用者提供的缓冲区中,gets从标准输入读一行字符到调用者提供的缓冲区中。

#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);
char *gets(char *s);
返回值:成功时s指向哪返回的指针就指向哪,出错或者读到文件末尾时返回NULL

gets函数无需解释,Man Page的BUGS部分已经说得很清楚了:Never use gets()。gets函数的存在只是为了兼容以前的程序,我们写的代码都不应该调用这个函数。gets函数的接口设计得很有问题,就像strcpy一样,用户提供一个缓冲区,却不能指定缓冲区的大小,很可能导致缓冲区溢出错误,这个函数比strcpy更加危险,strcpy的输入和输出都来自程序内部,只要程序员小心一点就可以避免出问题,而gets读取的输入直接来自程序外部,用户可能通过标准输入提供任意长的字符串,程序员无法避免gets函数导致的缓冲区溢出错误,所以唯一的办法就是不要用它。

现在说说fgets函数,参数s是缓冲区的首地址,size是缓冲区的长度,该函数从stream所指的文件中读取以'/n'结尾的一行(包括'/n'在内)存到缓冲区s中,并且在该行末尾添加一个'/0'组成完整的字符串。

如果文件中的一行太长,fgets从文件中读了size-1个字符还没有读到'/n',就把已经读到的size-1个字符和一个'/0'字符存入缓冲区,文件中剩下的半行可以在下次调用fgets时继续读。

如果一次fgets调用在读入若干个字符后到达文件末尾,则将已读到的字符串加上'/0'存入缓冲区并返回,如果再次调用fgets则返回NULL,可以据此判断是否读到文件末尾。

注意,对于fgets来说,'/n'是一个特别的字符,而'/0'并无任何特别之处,如果读到'/0'就当作普通字符读入。如果文件中存在'/0'字符(或者说0x00字节),调用fgets之后就无法判断缓冲区中的'/0'究竟是从文件读上来的字符还是由fgets自动添加的结束符,所以fgets只适合读文本文件而不适合读二进制文件,并且文本文件中的所有字符都应该是可见字符,不能有'/0'

fputs向指定的文件写入一个字符串,puts向标准输出写入一个字符串。

#include <stdio.h>

int fputs(const char *s, FILE *stream);
int puts(const char *s);
返回值:成功返回一个非负整数,出错返回EOF

缓冲区s中保存的是以'/0'结尾的字符串,fputs将该字符串写入文件stream,但并不写入结尾的'/0'。与fgets不同的是,fputs并不关心的字符串中的'/n'字符,字符串中可以有'/n'也可以没有'/n'puts将字符串s写到标准输出(不包括结尾的'/0'),然后自动写一个'/n'到标准输出。


socket编程---fgets和fputs函数使用理解

这一节是继续上一节socket05的讨论,来探讨在使用socket进行通信中遇到的一些函数使用理解误区1.fgets的使用注意点在写socket通信(代码见上一篇中,只是将sendbuf和recvbu...
  • tingyun_say
  • tingyun_say
  • 2016年07月24日 14:47
  • 1231

fgets fputs 的结合使用 ;gets puts的结合使用

先看每个函数的原型:
  • u012566181
  • u012566181
  • 2014年05月09日 11:40
  • 743

Linux下输入输出函数fgets,fputs函数,printf参数问题!!!

在研究socket通信时遇到了这个函数: 客户端需要发送信息到服务端,客户端就通过fgets函数从标准输入输入字符,服务端在通过fputs将字符输出到标准输出 fgets: #include ...
  • msdnwolaile
  • msdnwolaile
  • 2016年05月27日 08:50
  • 1097

linux c之用fopen、fputs、fgets、 fseek来对文件进行写、替换、读

1、函数说明 1、fgets #include char *fgets(char *s, int size, FILE *stream); 功能:从文件流读取一行,送到缓...
  • u011068702
  • u011068702
  • 2017年01月09日 20:47
  • 2404

fputs和fgets按行读写文件

1)fputs的使用 #include"stdio.h" #include "stdlib.h" #include "string.h" void main() { int i = 0; FIL...
  • genxirong
  • genxirong
  • 2016年08月04日 21:42
  • 801

fgets函数与fputs函数

fgets函数与fputs函数 #include         char *fgets(char *s, int size, FILE *stream); 功能:从文件流读取一行,送到缓冲区...
  • starboybenben
  • starboybenben
  • 2015年06月25日 18:43
  • 346

fgets函数与fputs函数

原文链接:http://www.embedu.org/Column/Column398.htm   #include                 char *fgets(char *s, ...
  • tanghui19900420
  • tanghui19900420
  • 2013年05月07日 18:36
  • 594

【C语言】scanf,fgets,fputs缓冲区问题

1 为什么输入回车后,程序就开始运行了? scanf仅在每一个数据域均有数据,并按回车后结束,程序继续运行。 因为scanf函数规定:在scanf函数接收数据时,遇到以下情况之一则结束一个数据的输...
  • chenglibin1988
  • chenglibin1988
  • 2013年05月04日 16:59
  • 3118

fgets函数与fputs函数

#include     char *fgets(char *s, int size, FILE *stream); 功能:从文件流读取一行,送到缓冲区,使用时注意以下几点:        ...
  • xingxing122
  • xingxing122
  • 2014年04月09日 17:00
  • 424

fgets()与fputs()函数

  • CG_Lueng
  • CG_Lueng
  • 2016年03月21日 17:27
  • 138
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fgets函数 和 fputs
举报原因:
原因补充:

(最多只允许输入30个字)