我有一個程序讀取具有已知結構的文本文件。保存當前讀取位置,以便日後可以尋求它
例如,我在文件的每一行有兩個整數和一個字符串。
當我在循環內使用fscanf
時,我可以重新獲得如上所述的n
結構。我如何獲得數據文件中的當前位置,以便將其存儲在某個位置,然後稍後繼續從我之前離開的位置繼續閱讀我的文本文件。
我有一個程序讀取具有已知結構的文本文件。保存當前讀取位置,以便日後可以尋求它
例如,我在文件的每一行有兩個整數和一個字符串。
當我在循環內使用fscanf
時,我可以重新獲得如上所述的n
結構。我如何獲得數據文件中的當前位置,以便將其存儲在某個位置,然後稍後繼續從我之前離開的位置繼續閱讀我的文本文件。
如果我理解正確,你正在尋找ftell功能
的過程與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);
使用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()所做的。
ffush,它做了什麼? – Richard
@Richard編輯答案來回答你的問題 –
在ftell
之前做fflush
在讀取記錄之前得到一個文件位置,擰緊接下來的記錄。在我的應用程序中,只有ftell
及更高版本fseek
正在爲我工作。
我的錯誤是嘗試使用fsetpos
而不是fseek
。對前者的爭論很奇怪,並且通過強制輸入到我的應用程序中,導致我的應用程序立即退出(不是故障,但顯然是我沒有預期的EOF)。
ftell和fseek是正確的,但正如我記得你不需要它們,只需編寫一個while循環並按順序讀取就可以完成你所需要的操作。如我錯了請糾正我。 –