2015-10-16 43 views
0

我的函数接收一个文件(FILE * f),该文件已经被读取,直到某个位置(未知的字节数)。在我的函数中,我也读了一些东西,所以位置指针改变了,但是在函数的结尾我想把它放在原来的位置,所以下一次读取将从我接收文件的位置开始。检索文件指针到原始位置

我知道,与FSEEK我可以带指针到哪里我想要的,但问题是,我不知道这是原来的位置...

例: file.txt的=>“ ABCDEFGHIJKLMOPQRSTUVWXYZ“

有人读取前3个字符,所以我的函数接收到指向D的文件。我读了4个字符并对它们做了任何事情,所以现在的位置是H,但我希望它取回到D.

+1

如果你知道你读了多少字节,你可以做一个相对回溯多个字节来恢复位置。 –

+3

'ftell()'是报告位置的标准函数,但它有局限性。为新的代码使用新的标准'fgetpos()'。 – chux

+2

['ftell()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/ftell.html)被定义为返回'long';在具有大文件支持的32位系统上,这不够好。现代功能是 ['fgetpos()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgetpos.html)和 ['fsetpos()'](http://pubs.opengroup .org/onlinepubs/9699919799/functions/fsetpos.html),但缺点是你不能对'fpos_t'值进行算术(以标准方式)。它们可以是结构类型,不一定是算术类型(并且是Solaris 7,IIRC上的结构)。 –

回答

1

正如人们在评论中告诉我的:

void myFunction(FILE* f) { 
    long position; 
    position = ftell(f); 
    /* 
    * Do stuff 
    */ 
    fseek(f,position,SEEK_SET); 
} 
+0

这应该工作,但是,总是检查返回的值形式ftell()和fseek()以确保操作成功。 – user3629249