2013-02-10 76 views
1

在使用seekg &對文件進行tellg的場景中,我想知道引擎蓋下發生了什麼?seekg如何查找文件的結尾?

// Open file and get file size 
    int myFileSize; 
    std::fstream myFile; 
    myFile.open(myFileName, std::ios::in|std::ios::binary); 
    if (myFile.is_open()) 
    { 
     myFile.seekg(0, std::ios::end); 
     myFileSize = myFile.tellg(); 
     myFile.seekg(0, std::ios::beg); 
     myFile.close(); 
    } 

Q1:是seekg實際上行走在文件的全部內容,直到它找到一些特殊的「EOF字符」?還是它使用文件系統提供的一些其他信息來「知道」文件末尾在哪裏?

Q2: seekg是一個尋求操作的流。這是否意味着文件的全部內容必須通過流?

請原諒我,如果我只有一個基本的瞭解這一切如何工作。

+1

關於「EOF字符」:https://latedev.wordpress.com/2012/12/04/all-about-eof/ – delnan 2013-02-10 00:24:49

回答

6

Q1:否操作系統將知道文件的大小,並且seekg()將使用該知識 - 無論文件長度是1,100還是10000000000字節,它都需要幾乎相同的時間。

Q2:不,它只是設置當前的「獲取指針」,即在Windows或Linux系統中轉換爲「SetFilePos」或「lseek」。幾乎所有其他操作系統都有類似的概念。

+0

謝謝你對我非常有幫助 – Lakey 2013-02-10 00:22:12

+0

@Mats Petersson我一直在想弄清楚如果ifstream已經知道文件系統中文件的大小,那麼獲取文件大小的最佳方法是,我認爲我們不得不做一些事情,比如去文件結尾,獲取大小,然後返回到開始。或者,正如有些人聲稱seekg結束並tellg方法是不可靠的,忽略最後的結果然後得到讀取的字符數。然後我看到了struct stat方法,但我不確定這是多麼便攜。有沒有簡單的方法? – Zebrafish 2017-08-31 13:19:02