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

时间:2013-07-23 05:46:12

标签: 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将具有用于读取文件的本地文件指针。

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

我看到fscanf的 man documentation但是在阅读后无法找到有关文件指针移动的任何内容。

有人可以解释或提供一个源,指明传递的文件指针在读取后实际移动了吗?

4 个答案:

答案 0 :(得分:1)

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

你可以看到sevral指针(_base&amp; _ptr),这意味着FILE会保持指向文件开头的指针(对于搜索,与任何其他流一样)和当前位置。

答案 1 :(得分:1)

ftell返回流的当前文件位置,并在出错时返回-1

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

    printf("%s>%ld\n", s, ftell(fp));
}

fscanf返回转换和分配的项目数。它会在出错时返回EOF。

答案 2 :(得分:1)

既然你要求参考,就在这里。

请参阅http://www.cs.cf.ac.uk/Dave/C/node18.html

读写文件部分

请参阅http://staff.um.edu.mt/csta1/courses/lectures/csa2060/c10.html

移动文件指针部分

答案 3 :(得分:1)

当您读/写文件时,文件指针会自动递增,以指示下一个字符的写入或读取位置。

本声明:

while( fscanf(fp, "%s", s ) != EOF )

测试是否到达文件末尾。

如果输入文件的格式不符合预期,则有机会进入无限循环。