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

标签 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;
}

我预计这将在无限循环中继续打印文件的第一个单词。我认为文件指针被用作输入只是为了获取应该读取输入的位置,而 fscanf 将有一个本地文件指针,它将用于读取文件。

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

我看到了 man documentation fscanf 但在阅读后找不到任何关于文件指针移动的信息。

有人可以解释或提供指定传递的文件指针在读取后实际移动的来源吗?

最佳答案

来自文档:“从流中读取数据...”这意味着它将充当您从中读取的其他流。 ( 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

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

关于c - fscanf 是否将传递的文件指针向前移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17802302/

相关文章:

c - 为什么编译器可以接受这个?

c - 程序执行终止于代码块

java - java中的文本文件到数组

c sscanf 检查一行中是否有多个参数?

c - C语言如何收集多个格式参数?

CC\GCC 编译后的可执行文件无法在我的机器上运行?

c - 在 C 中的 .gz 文件中搜索模式

c++ - OpenCV 3.0 - 错误 : (-215) scn == 3 || scn == 4 in function ipp_cvtColor

提示时出现 C 无限循环问题

c - qsort() - 对字符串数组进行排序