fgets()函数会移动文件指针吗?

8

fgets()函数是否会自动将文件指针移动到我所提供的大小参数的位置?

举个例子:

文件p.txt的内容是“我是一个好孩子”。使用fgets(a,5,fp1)后,文件指针是否向前移动了5个位置?

在任何书籍中都没有清楚地找到这个答案,因此有这个疑问。


2
fgets() 不会修改 FILE*。如果文件可寻址,文件偏移量 可能会被修改。 - EOF
3
我想知道你为什么会这样问。你有一些代码表明了不同的情况吗?这个问题肯定是有一些背景的,请解释一下。 - Support Ukraine
1
@SamS - 你为什么认为关于fgets()的问题是关于fread()问题的重复? - ryyker
原因是我想将一个文件复制到另一个文件。所以在我的脑海中出现了一个问题,如果指针不移动,那么我在fgets()参数中的字符串变量将拥有相同的字符串。 - Arka Prava Paul
@ArkaPravaPaul - 当使用fgets时,文件位置指示器会发生变化。连续的fgets将不会返回相同的数据。这并不是问题。 - Support Ukraine
2个回答

7
使用fgets(a,5,fp1)后文件指针会向前移动5个位置吗?
指针fp1不受fgets(或任何其他stdio I/O例程)的影响; fp1指向的FILE对象将更新以反映新的文件位置,但指针本身不会改变。

你能推荐一些关于C语言的参考书或资料吗?我在任何一本特定的书中都找不到相关内容。 - Arka Prava Paul
1
@ArkaPravaPaul:自从80年代末开始使用Harbison&Steele的C:参考手册(目前为第5版,涵盖C99),我也听说过King的C编程:现代方法很不错,尽管我没有个人经验。此外,您应该将C语言标准的最新在线草案加入书签。 - John Bode
非常感谢。干杯。 - Arka Prava Paul
这是关于函数最关键的细节,没有cpp参考、man页面或网站说明有一个文件位置被递增的基本事实,它们只让你自己解决——从输出中很明显,而且如果没有它,该函数将毫无用处,因为没有偏移参数,所以你总是从文件开头读取,并且无法读取超过换行符。我不知道为什么这些网站不明确说明它,那么像这样的问题就不会被问到了。 - Lewis Kelsey
@LewisKelsey:因为流不必绑定到文件,并且这是一个极其低级的细节,stdio库明确设计了隐藏它的细节。你调用fgets,神奇的事情发生了,数据出现在目标缓冲区中。 - John Bode

3

fgets 函数不会修改文件指针。

但是,文件偏移量将增加实际读取的字节数。


1
你应该强调,“读取的字节数”不等于fgets的第二个参数;它最多会比该值少一个,而且可能更小(如果遇到EOF、换行符或读取错误)。 - zwol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接