【C语言基础】fgets函数详解

文章解释了fgets函数的工作原理,它按行读取文件内容,遇到文件末尾或错误时返回空指针。通过不断循环直到文件末尾,实现逐行打印文件内容。讨论了如何通过减少字符串长度传递来优化性能。
摘要由CSDN通过智能技术生成

       先看定义

      

       首先第一个参数,这里应该传一个空字符串进去,他会把读到的字符串拷贝到这个空字符串里面,第二个参数是你想一共要读到的字符个数(注意,这里包括’\0’的空间,这么说把,假设我们一共就在这里写了10,那他实际只会读9个字符,最后一个字符默认补上’\0’,传到str的最后一个空位),第三个参数是目标文件指针

       如果读取成功了,就返回str的地址

       如果读取的时候遇到了文件末尾,或者是读取错误,就会返回空指针

      

      

      

       现在讲讲这个函数运作的具体流程

       值得确定的确定的是,这个函数只会读一行的内容,并不会跨行读取

       我们来详细看看

       我们依旧拿上面这个文件作为例子

       我们试着读取12个字符

      

       可见,换行后的字符全部读不到,换行前的字符全部读得到,包括’\n’都可以读到

       如果我想读下一行,只要再读一次就行

       我们现在再读取12个字符看看

      

       于是下一行就被打印出来了

       那如果我们想要打印文件里面所有的内容怎么办???

       我们看个例子

      

      

       因为fgets只有读到文件末尾时才会返回空指针

       所以当我们这么设计函数的时候,fgets会不断拷贝字符串给str,然后交给str打印,循环过后之后,fgets又会拷贝字符串给str,再打印,碰到行末就不再拷贝了(没碰到行末的时候,会一直读,直到读到的字符的个数等于(10 -1) 个为止,没读到行末也不会换行,这一行剩下的交给下一个循环的fgets去读吧),下一行的拷贝工作交给下个循环的fgets做去,不断循环不断循环,直到某一个fgets发现已经到文件末尾了,就返回空指针,然后导致循环结束,那么此时文件里面所有的内容都被打印下来了,因为fgets连’\n’都会拷贝下来,所以我们在打印的时候连换行符都不用加

       我们来看看效果

      

       当然,细心的你肯定会发现,因为fgets传给str的字符串末尾一定带一个’\0’,所以我是不是可以每次只传两个字符给str,也能实现相同的效果呢

       我们来试试

      

       答案是肯定的,这效果一模一样,只是函数调用次数比较多就是了,感觉会比较浪费性能

      

       肯定会有小天才这么问啊,如果我只传’\0’会发生什么???

       虽然这么做没啥意义,还是演示一下吧

      

       答案就是什么都打印不出来,每次打印都只有’\0’,相当于什么都不读,什么都不拷贝给str,然后就一直循环停不下来了

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值