3

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

#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 文档,但在阅读后找不到有关文件指针移动的任何内容。

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

4

4 回答 4

2

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

如果你去文件的定义(文件 - 去定义)你会得到这个 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 保留指向文件开头(用于查找,与任何其他流一样)和指向当前位置的指针。

于 2013-07-23T05:57:10.987 回答
2

ftell返回流的当前文件位置并且-1出错。

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

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

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

于 2013-07-23T06:03:46.187 回答
2

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

请参阅http://www.cs.cf.ac.uk/Dave/C/node18.html的读写文件部分

请参阅移动http://staff.um.edu.mt/csta1/courses/lectures/csa2060/c10.html的文件指针部分

于 2013-07-23T06:05:05.770 回答
1

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

这个说法 :

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

测试是否到达文件末尾。

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

于 2013-07-23T06:12:10.190 回答