在C语言中读取文件:如何在同一文件上多次执行fgets?

4
例如:
我有一个while循环,可以遍历整个文件。
while (fgets(line, MAXLINE-1, filePointer)!=NULL){
// do something;
}
fclose(filePointer);

循环结束后,如果我在同一文件上调用fgets将会返回null,因为fgets已经读取完整个文件。那么如果我想再次使用fgets()该如何重新读取文件呢?

3
man fseek 是一个用于查看 Linux 操作系统中 fseek() 函数文档的命令。fseek() 函数可以在文件中移动指针的位置,以便进行读取或写入操作。 - Eugene Sh.
2
或者 http://www.tutorialspoint.com/c_standard_library/c_function_rewind.htm - Martin Beckett
2
尝试使用 rewind(FILE *stream); - Andrey Belykh
你不能将读取的行存储在变量中,而不是反复在文件中移动吗? - Leonardo Alves Machado
顺便提一下:fgets(line, MAXLINE-1, filePointer)中的 -1 看起来有点可疑。发布更多代码将有助于确定它对这个问题的影响。 - chux - Reinstate Monica
2个回答

3

要重置文件指针,您可以使用两种方法:

rewind(fp);

并且:

 fseek(fp, 0L, SEEK_SET);

在此处,fp是文件指针。您可以再次调用fgets()从文件开头读取文件。


好奇,使用0L而不是简单的0有什么特别的原因吗? - chux - Reinstate Monica
@chux 我只是记得我曾经看到过这样的东西,所以它只是从记忆中提取出来的。 - machine_1
@chux man fseek 给出了这个例子。可能是为了强调它需要 long 类型的参数。 - Eugene Sh.
@EugeneSh。它也在C规范中 - 除了试图进行说明之外,我无法理解其他原因。你认为有必要吗? - chux - Reinstate Monica
1
@chux 我没有看到针对零的情况。只有当他们假设可以用某个大常数替换 0 并且使用一些旧标准,实际上需要后缀时才会出现这种情况。 - Eugene Sh.

3

在while循环结束时,文件指针会到达文件末尾(也称为EOF)。操作系统会记录指针的位置,以便跟踪您在文件中的位置,以便可以从该位置继续读取。您只需要将文件指针移动到文件开头即可。现在有两种方法可以实现:使用rewind()方法或fseek()方法。具体如下:

rewind(fp);

或者

fseek(fp, 0, SEEK_SET);

在再次读取同一文件之前,请使用此操作。为了记录,fp指的是您要读取的文件。


你应该补充说明一些流不支持寻址,例如终端和管道。 - chqrlie
@chqrlie;nvm;我的错;我在倒带或fseek之前关闭了文件,后来意识到我应该在关闭文件之前这样做。但还是谢谢你的回复。 - ElleryL
或者,您可以关闭文件,然后再次打开它。 - Weather Vane
是的,如果它要用在终端或其他地方,它不会按照预期工作。 - Vivek Raj

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