我正在编写一个程序来逐行读取文件。我知道fgets()将读取新行,n-1个字符或EOF。令我困惑的是fgets()如何知道前进到新行/文件中的位置?
为了更清楚,我知道在Java中你必须明确告诉扫描仪阅读下一行。但是在C语言中,我只是将fgets()置于while循环中并相信这是它的工作。
我怎样才能在逻辑上向我保证fgets()实际上是在推进到下一行,而不是在while循环中一遍又一遍地读同一行(是的,我知道我可以打印出来的东西)?
答案 0 :(得分:4)
fgets()
的语义非常简单:从FILE*
流指针读取字节,直到:
n-1
字节已被读取并存储到其中)。EOF
调用或等效项返回fgetc()
。 ferr()
返回feof()
后,可以通过调用fgets()
和/或NULL
来区分文件结束和读取错误情况。除非立即到达文件末尾(fgets()
返回NULL
)或者指定缓冲区大小为具有大小为0。
fgets()
的行为就像使用fgetc()
一次读取一个字节一样。
fgets()
使用从流中读取的字节并将它们存储到目标数组中。除非您使用rewind()
,fseek()
或fsetpos()
显式向后搜索流,否则它无法再次读取相同的字节,前提是该流支持搜索。附加到常规文件的流通常支持搜索,但是以文本模式打开的文件需要在某些系统上进行特定处理,尤其是Microsoft Windows。另请注意,在实际流中的任何字节之前,ungetc()
将读取一个带回fgets()
的流的字节。
fgets()
将换行符存储到目标数组中,如果该行足够短以适应空终止符之前的数组。
fgets()
会将长行分成更小的块。处理长行很棘手且容易出错。请注意,当fgets()
由于目标数组中的空间不足而读取部分行时,对fgets()
的下一次调用将继续从上一次调用停止时的同一行读取。
如果从fgets()
返回时,目标数组不以换行符结束,则会发生以下情况之一:
错误处理这些案件可能会导致潜在的未定义行为和/或可利用的漏洞。