4

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

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

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

4

6 回答 6

10

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

于 2012-05-20T00:05:08.487 回答
2

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

于 2012-05-19T23:50:41.123 回答
1

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);
于 2012-05-19T23:56:30.680 回答
1

fflush在读取记录之前ftell先获取文件位置,然后搞砸下一个记录。在我的应用程序中,just ftelland laterfseek正在为我工​​作。

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

于 2018-02-25T02:26:14.067 回答
0

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

于 2012-05-19T23:50:43.510 回答
0

ftell()返回一个 long,这对于小文件是可以的。

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

于 2020-12-02T20:48:54.547 回答