fgets函数与fputs函数

  char *fgets(char *s, int size, FILE *stream);

功能:从文件流读取一行,送到缓冲区,使用时注意以下几点:
        返回值:成功时s指向哪返回的指针就指向哪,出错或者读到文件末尾时返回NUL

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

fgets()函数中,第一个参数指针需要我们事先分配好大小。另外,fgets()函数不适合取二进制的文件,这样,容易发生错误。

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

1.当遇到换行符或者缓冲区已满,fgets就会停止,返回读到的数据,值得注意的是不能用fgets读二进制文件,因为fgets会把二进制文件当成文本文件来处理,这势必会产生乱码。

2.每次调用,fgets都会把缓冲区的最后一个字符设为null,这意味着最后一个字符不能用来存放需要的数据,所以如果有一行,含有LINE_SIZE个字符(包括换行符),要想把这行读入缓冲区,请把参数n设为LINE_SIZE+1

3. 由结论1可推出:给定参数n,fgets只能读取n-1个字符(包括换行符),如果有一行超过n-1个字符,那么fgets返回一个不完整的行,也就是说,只读取该行的前n-1个字符,但是,缓冲区总是以null字符结尾,对fgets的下一次调用会继续读该行。

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

其行为方式如下:
(1)遇到换行或文件结束EOF则返回
(2)按行读取。
(3)每一行结束处的换行字符‘\n’也算该行字符
(4)对于大小为size的buf,最多只读取size-1个字符。
(5)自动地把buf中最后一个字符(通常是换行符)的后面一个字节填充零结束符('\0')

因此如果想把buf中的换行符去掉,可以这样:buf[strlen(buf)-1] = '\0';当前前提是buf足够大,可以容纳完整的一行(包括最后的那个换行符)。

 int fputs(const char *s, FILE *stream);

返回值:成功返回一个非负整数,出错返回EOF

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

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

(1)把str中零结束符之前的全部文字输入到文件中。
(2)输入完成后,不会增加额外的特殊字符,如换行符等。
如果想输入完str后,就换行,则应该在上述调用后,再调用fputc('\n',fp);才行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值