fscanf 是否将传递的文件指针向前移动?

Ami*_*mar 5 c file-io scanf file-pointer

我在某处看到过这段代码:

#include<stdio.h>

int main()
{
    FILE * fp;
    char s[1024];
    fp = fopen("file","r");

    while( fscanf(fp, "%s", s ) != EOF )
    {
        puts(s);
    }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我预计这将继续无限循环地打印文件的第一个单词。我相信文件指针被视为输入只是为了获取应该读取输入的点,而 fscanf 将有一个本地文件指针,它将用来读取文件。

但在运行时我意识到它实际上打印了整个文件。我能得出的唯一结论是,在读取第一个输入后,它实际上将传递的文件指针向前移动,否则它只会一次又一次地继续打印第一个单词。

我看到了fscanf 的man 文档,但在阅读后找不到有关文件指针移动的任何内容。

有人可以解释一下或给出一个来源,其中指定传递的文件指针在读取后实际上会移动吗?

asa*_*rob 2

从文档中:“从流中读取数据...”这意味着它将充当您从中读取的其他流。(http://www.cplusplus.com/reference/cstdio/fscanf/

如果你转到文件的定义(FILE - 转到定义),你将得到这个 typedef

#ifndef _FILE_DEFINED
struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
Run Code Online (Sandbox Code Playgroud)

您可以在其中看到几个指针(_base 和 _ptr),这意味着 FILE 保留指向文件开头(用于查找,与任何其他流一样)和当前位置的指针。