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 文档,但在阅读后找不到有关文件指针移动的任何内容。
有人可以解释一下或给出一个来源,其中指定传递的文件指针在读取后实际上会移动吗?
从文档中:“从流中读取数据...”这意味着它将充当您从中读取的其他流。(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 保留指向文件开头(用于查找,与任何其他流一样)和当前位置的指针。