STL文件讀寫基礎


stl中對文件讀寫的函數在頭文件fstream中定義,它的基本對象模型如下:

其中包含三個對象ifstrea、ofstream和fstream,分別對文件提供只讀、只寫、讀寫功能,從其對象繼承關系也可以看出這一點。下面就簡單的介紹下基本的文件方法

打開文件

打開文件一般有兩種方式:

1、在構造函數中打開

    ifstream input("r:\\3.txt", ios::in | ios::binary);

2、通過open函數打開

    ofstream output;
    output.open("r:\\3.txt", ios::out | ios::binary);

不管用哪種方式,都需要傳入兩個參數:第一個參數是文件名,第二個參數是打開選項,常見的選項有:in、out、app(append)、binary等。第二個參數也可以不傳,此時,對於ifstream,就是以讀方式打開、ofstream以寫方式打開。

檢查是否打開成功

可以通過good函數檢查文件是否打開成功:

    if (!input.good())
    {
        cout << "file open fail" << endl;
        return 1;
    }

這個good函數也可以去掉,直接檢查steam是否為真(這樣可讀性不好,不建議,但許多歷史代碼喜歡這么寫,還是應該學習一下)。

    if (!input)
    {
        cout << "file open fail" << endl;
        return 1;
    }

定位和獲取當前位置

有的時候,我們需要對文件進行隨機訪問,如連接兩個文件的時候就要定位到文件的末尾。在stl中可以通過stream對象的seekg實現這一功能。與之相對的就是獲取當前位置,函數為tellg,如下代碼演示了利用這兩個函數獲取文件長度。

    input.seekg (0, ios::end);
    int length = input.tellg();

tellg函數比較簡單,沒有參數,直接返回當前位置。而seekg有兩個參數:第一個參數是偏移量,可以為負數;第二個參數則是相對位置,可以選取ios::begbeginios::endendios::curcurrent三個值,這個參數可以省略,省略的時候是取的ios::beg從文件頭定位。

關閉文件

關閉文件有兩個方法:

  1. 調用close方法顯式關閉
  2. 對象刪除的時候隱式關閉

具體使用哪個這個看個人喜好了,就我個人而言,我一般喜歡在構造函數中打開文件,不習慣調用open函數,因此也比較傾向於隱式關閉,不調用close函數。

讀寫文件

下面我們就以一個文件拷貝為例簡單的介紹下讀寫的方式:

1、傳統的緩沖區讀寫

    char buf[1024];
    while(!input.
eof())
    {
        int count = sizeof(buf);
        input.
read(buf, count);
        output.
write(buf, count);
    }

這里主要用到了三個函數:read函數為讀,write函數寫,eof檢查是否讀取到了文件結尾。

2、利用string逐行讀寫

    string line;
    while(std::
getline(input, line))
        output
<< line << endl ;

這里用了getline行數從流里每次讀寫一行,用 << 運算符將內容寫入流,不過這種方式僅僅適合讀寫文本文件。

3、流方式讀寫

    output << input.rdbuf();

這個方式非常簡單,只用了一行代碼就可以實現:用rdbuf函數獲取讀緩沖區,用 << 運算符在兩個流對象之間建立管道。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM