先看定义
首先第一个参数,这里应该传一个空字符串进去,他会把读到的字符串拷贝到这个空字符串里面,第二个参数是你想一共要读到的字符个数(注意,这里包括’\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,然后就一直循环停不下来了