C++ seekg函數用法詳解

2020-07-16 10:04:42
很多時候使用者可能會這樣操作,開啟一個檔案,處理其中的所有資料,然後將檔案倒回到開頭,再次對它進行處理,但是這可能有點不同。例如,使用者可能會要求程式在資料庫中搜尋某種型別的所有記錄,當這些記錄被找到時,使用者又可能希望在資料庫中搜尋其他型別的所有記錄。

檔案流類提供了許多不同的成員函數,可以用來在檔案中移動。其中的一個方法如下:

seekg(offset, place);

這個輸入流類的成員函數的名字 seekg 由兩部分組成。首先是 seek(尋找)到檔案中的某個地方,其次是 "g" 表示 "get",指示函數在輸入流上工作,因為要從輸入流獲取資料。

要查詢的檔案中的新位置由兩個形參給出:新位置將從由 place 給出的起始位置開始,偏移 offset 個位元組。offset 形參是一個 long 型別的整數,而 place 可以是 ios 類中定義的 3 個值之一。起始位置可能是檔案的開頭、檔案的當前位置或檔案的末尾,這些地方分別由常數 ios::beg、ios::cur 和 ios::end 表示。

有關在檔案中移動的更多資訊將在後面的章節中給出,目前先來關注如何移動到檔案的開頭。要移到檔案的開始位置,可以使用以下語句:

seekg(0L,ios::beg);

以上語句表示從檔案的開頭位置開始,移動 0 位元組,實際上就是指移動到檔案開頭。

注意,如果目前已經在檔案末尾,則在呼叫此函數之前,必須清除檔案末尾的標誌。因此,為了移動到剛讀取到末尾的檔案流 dataln 的開頭,需要使用以下兩個語句:

dataIn.clear();
dataIn.seekg(0L, ios::beg);

下面的程式演示了如何倒回檔案的開始位置。它首先建立一個檔案,寫入一些文字,並關閉檔案;然後開啟檔案進行輸入,一次讀取到最後,倒回檔案開頭,然後再次讀取:
//Program shows how to rewind a file. It writes a text file and opens it for reading, then rewinds
// it to the beginning and reads it again.
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // Variables needed to read or write file one character at a time char ch;
    fstream ioFile("rewind.txt", ios::out);
    // Open file.
    if (!ioFile)
    {
        cout << "Error in trying to create file";
        return 0;
    }
    // Write to file and close
    ioFile << "All good dogs" << endl << "growl, bark, and eat." << endl;
    ioFile.close();
    //Open the file
    ioFile.open ("rewind.txt", ios::in);
    if (!ioFile)
    {
        cout << "Error in trying to open file";
        return 0;
    }
    // Read the file and echo to screen
    ioFile.get(ch);
    while (!ioFile.fail())
    {
        cout.put(ch);
        ioFile.get(ch);
    }
    //Rewind the file
    ioFile.clear();
    ioFile.seekg(0, ios::beg);
    //Read file again and echo to screen
    ioFile.get(ch);
    while (!ioFile.fail())
    {
        cout.put(ch);
        ioFile.get(ch);
    }
    return 0;
}
程式輸出結果:

All good dogs
growl, bark, and eat.
All good dogs
growl, bark, and eat.