2012-05-19 55 views
1

我有一個程序讀取具有已知結構的文本文件。保存當前讀取位置,以便日後可以尋求它

例如,我在文件的每一行有兩個整數和一個字符串。

當我在循環內使用fscanf時,我可以重新獲得如上所述的n結構。我如何獲得數據文件中的當前位置,以便將其存儲在某個位置,然後稍後繼續從我之前離開的位置繼續閱讀我的文本文件。

+0

ftell和fseek是正確的,但正如我記得你不需要它們,只需編寫一個while循環並按順序讀取就可以完成你所需要的操作。如我錯了請糾正我。 –

回答

0

如果我理解正確,你正在尋找ftell功能

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

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

+0

ffush,它做了什麼? – Richard

+0

@Richard編輯答案來回答你的問題 –

0

ftell之前做fflush在讀取記錄之前得到一個文件位置,擰緊接下來的記錄。在我的應用程序中,只有ftell及更高版本fseek正在爲我工​​作。

我的錯誤是嘗試使用fsetpos而不是fseek。對前者的爭論很奇怪,並且通過強制輸入到我的應用程序中,導致我的應用程序立即退出(不是故障,但顯然是我沒有預期的EOF)。

相關問題