【发布时间】:2017-08-11 04:41:10
【问题描述】:
我正在编写一个程序来逐行读取文件。我知道 fgets() 会一直读到换行、n-1 个字符或 EOF。让我困惑的是 fgets() 如何知道前进到新行/它在文件中的位置?
为了更清楚,我知道在 Java 中你必须明确告诉扫描器读取下一行。但是在 C 语言中,我只是将 fgets() 放在一个 while 循环中,并相信它可以完成它的工作。
我如何在逻辑上让自己确信 fgets() 实际上正在前进到下一行,而不是在那个 while 循环中一遍又一遍地读取同一行(是的,我知道我可以打印出来)?
【问题讨论】:
-
鉴于 fgets() 接受一个文件指针,它只会将该指针推进到文件中,刚好超过下一个换行符。如果您要对该文件使用任何读取功能(不仅仅是 fgets),这些功能将从 fgets() 离开文件指针的位置开始:就在换行符之后。
-
“不在那个 while 循环中一遍又一遍地读取同一行”:从某种意义上说,你不能。您只需信任实现库功能的人。因此,如果不知何故,在某个地方,你有一个 April-1st 样式库,你的场景可能会发生(并且 ftell 之类的功能同样会被破坏)。但这当然不应该。
-
关闭和打开文件是重新启动的一种方式,是的。使用
rewind或fseek可能更容易(也快一点)。阅读 fgets、rewind、fseek 等的手册页。或者看看你是否可以在 C 中找到关于文件/流访问的相当详细的指南。The C IO chapter of Wikibooks 可能是一个好的开始。 -
一般来说,试着把一个文件想象成你移动的一系列连续的字节,一路读取它们。如果你的文件很短,你可以在一张纸上画出各种动作,看看事情是如何移动的,包括 fgets。
-
关于 fgets 有一点需要注意:如果 size 参数比行短,fgets 会读到那个点。下一次迭代,它将从那个点继续。它不会跳过该行的其余部分并从下一行开始。因此,如果您想读取整行,请始终确保 size 参数(和输入缓冲区)与您要读取的最长行(包括换行符)一样长。