獲得和設(shè)置流指針(get and put stream pointers)
所有輸入/輸出流對(duì)象(i/o streams objects)都有至少一個(gè)流指針:
ifstream, 類似istream, 有一個(gè)被稱為get pointer的指針,指向下一個(gè)將被讀取的元素。
ofstream, 類似 ostream, 有一個(gè)指針 put pointer ,指向?qū)懭胂乱粋(gè)元素的位置。
fstream, 類似 iostream, 同時(shí)繼承了get 和 put
我們可以通過使用以下成員函數(shù)來讀出或配置這些指向流中讀寫位置的流指針:
tellg() 和 tellp()
這兩個(gè)成員函數(shù)不用傳入?yún)?shù),返回pos_type 類型的值(根據(jù)ANSI-C++ 標(biāo)準(zhǔn)) ,就是一個(gè)整數(shù),代表當(dāng)前get 流指針的位置 (用tellg) 或 put 流指針的位置(用tellp).
seekg() 和seekp()
這對(duì)函數(shù)分別用來改變流指針get 和put的位置。兩個(gè)函數(shù)都被重載為兩種不同的原型:
seekg ( pos_type position );
seekp ( pos_type position );
使用這個(gè)原型,流指針被改變?yōu)橹赶驈奈募_始計(jì)算的一個(gè)絕對(duì)位置。要求傳入的參數(shù)類型與函數(shù) tellg 和tellp 的返回值類型相同。
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );
使用這個(gè)原型可以指定由參數(shù)direction決定的一個(gè)具體的指針開始計(jì)算的一個(gè)位移(offset)。它可以是:
ios::beg |
從流開始位置計(jì)算的位移 |
ios::cur |
從流指針當(dāng)前位置開始計(jì)算的位移 |
ios::end |
從流末尾處開始計(jì)算的位移 |
流指針get 和put 的值對(duì)文本文件(text file)和二進(jìn)制文件(binary file)的計(jì)算方法都是不同的,因?yàn)槲谋灸J降奈募心承┨厥庾址赡鼙恍薷摹S捎谶@個(gè)原因,建議對(duì)以文本文件模式打開的文件總是使用seekg 和 seekp的第一種原型,而且不要對(duì)tellg 或 tellp 的返回值進(jìn)行修改。對(duì)二進(jìn)制文件,你可以任意使用這些函數(shù),應(yīng)該不會(huì)有任何意外的行為產(chǎn)生。
以下例子使用這些函數(shù)來獲得一個(gè)二進(jìn)制文件的大小:
// obtaining file size
#include
#include
const char * filename = “example.txt”;
int main () {
long l,m;
ifstream file (filename, ios::in|ios::binary);
l = file.tellg();
file.seekg (0, ios::end);
m = file.tellg();
file.close();
cout << “size of ” << filename;
cout << “ is ” << (m-l) << “ bytes.”n“;
return 0;
}
size of example.txt is 40 bytes.
相關(guān)推薦:等考C++備考之如何學(xué)習(xí)C++與面向?qū)ο螅航M合北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |