我在某处看到这段代码:
#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/