2015-10-16 41 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