我在某处看到了这段代码:
#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但是在阅读后无法找到有关文件指针移动的任何内容。
有人可以解释或提供一个源,指明传递的文件指针在读取后实际移动了吗?
答案 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 )
测试是否到达文件末尾。
如果输入文件的格式不符合预期,则有机会进入无限循环。