保存当前的读取位置,以便我可以在以后查找

时间:2012-05-19 23:45:13

标签: c io scanf

我有一个程序可以读取具有已知结构的文本文件。

例如,我在文件的每一行都有两个整数和一个字符串。

当我在循环中使用fscanf时,我可以重新获得n结构,如上所述。如何获取我在数据文件中的当前位置,因此我将其存储在某处,然后继续从我之前离开的位置继续阅读我的文本文件。

6 个答案:

答案 0 :(得分:6)

使用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()的作用。

答案 1 :(得分:2)

使用ftell存储文件的位置fseek以便稍后返回。

答案 2 :(得分:1)

ftellfseek的过程非常简单。请参阅示例代码

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);

答案 3 :(得分:0)

如果我理解正确,您正在寻找ftell功能

答案 4 :(得分:0)

fflush之前执行ftell以在读取记录之前获取文件位置,然后拧紧下一条记录。在我的申请中,只有ftell和之后fseek正在为我工​​作。

我的错误是尝试使用fsetpos代替fseek。前者的论点很奇怪,强迫ftell输出导致我的应用程序立即退出(没有错误,但显然是EOF我没想到这么快)。

答案 5 :(得分:0)

ftell()返回一个long,对于小文件来说可以。

对于更长的文件,我使用uint64_t pos = lseek(fd, 0, SEEK_CUR),因为lftell()似乎不存在。