seekg()/seekp()與tellg()/tellp()的用法詳解
來源 https://blog.csdn.net/mafuli007/article/details/7314917
對輸入流操作: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個字節
如果vc編程的話最好使用CFile類等更加方便於文件操作.
=============== End