保存当前的读取位置,以便我可以在以后查找
我有一个程序读取具有已知结构的文本文件。
例如,我在文件的每一行都有两个整数和一个字符串。
当我在循环中使用fscanf
,我可以重新获得如上所述的n
结构。 如何在数据文件中获取当前位置,因此我将其存储在某处,然后继续从我之前停止的位置读取我的文本文件。
使用ftell()函数。 它将返回文件中的偏移量。
unsigned long position = ftell(file);
但是,对于文本文件,知道ftell()可以报告错误的位置非常重要,除非已清除内部缓冲区。 去做这个,
unsigned long position; fflush(file); position = ftell(file);
之后,您可以使用fseek
fseek(file,position,SEEK_SET);
ftell()告诉我们使用前面文件开头的偏移量。 在这里,您使用SEEK_SET指示您传递的位置是从文件的开头。
编辑:理查德询问fflush()的作用。 在读取或写入文件时,C库几乎总是保留信息的缓冲区。 “刷新”该缓冲区是将其写入磁盘,以保存任何更改。 由于允许C库处理文本文件的方式,除非刷新缓冲区,否则此缓冲区可能会导致ftell()报告错误的位置。 这就是fflush()的作用。
使用ftell存储文件的位置fseek以便稍后返回。
ftell
和fseek
的过程很简单。 请参阅示例代码
int i, int1, int2; FILE *file; char *str1; ... // read 10 lines for(i=0; i<10; i++){ fscanf(file, "%d %d %s", int1, int2, str1); } // save the position; pos = ftell(file); // close the file fclose(file) ... // later go to that same location after opening the same file fseek(file, pos, 0); // continue reading fscanf(file, "%d %d %s", int1, int2, str1);
如果我理解正确,你正在寻找ftellfunction
在ftell
之前执行fflush
以在读取记录之前获取文件位置,然后拧紧下一条记录。 在我的申请中,只有ftell
和后来的fseek
正在为我工作。
我的错误是尝试使用fsetpos
而不是fseek
。 对前者的争论是奇怪的,并且通过强制ftell
输出进入它导致我的应用程序立即退出(没有错误,但显然是EOF我没想到这么快)。