1. 程式人生 > >C++:fstream類中seekg()/seekp()與tellg()/tellp()的用法詳解

C++:fstream類中seekg()/seekp()與tellg()/tellp()的用法詳解

對輸入流操作:seekg()與tellg()
對輸出流操作:seekp()與tellp()
下面以輸入流函式為例介紹用法:
seekg()是對輸入檔案定位,它有兩個引數:第一個引數是偏移量,第二個引數是基地址。
對於第一個引數,可以是正負數值,正的表示向後偏移,負的表示向前偏移。而第二個引數可以是:
ios::beg:表示輸入流的開始位置
ios::cur:表示輸入流的當前位置
ios::end:表示輸入流的結束位置
tellg()函式不需要帶引數,它返回當前定位指標的位置,也代表著輸入流的大小。

假設檔案test。txt為以下內容:
hello,my world
name:hehonghua
date:20090902
程式為:
#include <iostream>
#include <fstream>
#include <assert.h>
using namespace std;
int main()
{
    ifstream in("test.txt");
    assert(in);
    in.seekg(0,ios::end);       //基地址為檔案結束處,偏移地址為0,於是指標定位在檔案結束處
    streampos sp=in.tellg(); //sp為定位指標,因為它在檔案結束處,所以也就是檔案的大小
    cout<<"filesize:"<<endl<<sp<<endl;

    in.seekg(-sp/3,ios::end); //基地址為檔案末,偏移地址為負,於是向前移動sp/3個位元組
    streampos sp2=in.tellg();
    cout<<"from file topoint:"<<endl<<sp2<<endl;

   in.seekg(0,ios::beg);        //基地址為檔案頭,偏移量為0,於是定位在檔案頭
   cout<<in.rdbuf();            //從頭讀出檔案內容
    in.seekg(sp2);

    cout<<in.rdbuf()<<endl; //從sp2開始讀出檔案內容

    return 0;
}
則結果輸出:
file size:
45
from file to point:
30
hello,my world
name:hehonghua
date:20090902
date:20090902

C++檔案流檢測EOF

成員函式eof()用來檢測是否到達檔案尾,如果到達檔案尾返回非0值,否則返回0。原型是inteof();

例:if(in.eof())ShowMessage("已經到達檔案尾!");

C++檔案流檔案定位

和C的檔案操作方式不同的是,C++ I/O系統管理兩個與一個檔案相聯絡的指標。一個是讀指標,它說明輸入操作在檔案中的位置;另一個是寫指標,它下次寫操作的位置。每次執行輸入或輸出時,相應的指標自動變化。所以,C++的檔案定位分為讀位置和寫位置的定位,對應的成員函式是 seekg()和 seekp(),seekg()是設定讀位置,seekp是設定寫位置。它們最通用的形式如下:

1.  istream &seekg(streamoff offset,seek_dir origin);  

2.  ostream &seekp(streamoff offset,seek_dir origin);  

streamoff定義於 iostream.h 中,定義有偏移量 offset 所能取得的最大值,seek_dir 表示移動的基準位置,是一個有以下值的列舉:

ios::beg: 檔案開頭

ios::cur: 檔案當前位置

ios::end: 檔案結尾

這兩個函式一般用於二進位制檔案,因為文字檔案會因為系統對字元的解釋而可能與預想的值不同。

例:

1.  file1.seekg(1234,ios::cur);//把檔案的讀指標從當前位置向後移1234個位元組  

2.  file2.seekp(1234,ios::beg);//把檔案的寫指標從檔案開頭向後移1234個位元組