輸入流的讀取多個(gè)字符的操作多用read。
read的定義形式如下
basic_istream& read( char_type *_Str, streamsize _Count );
char_type* 是流字符類型的指針,這個(gè)指針是用來(lái)存儲(chǔ)要讀取的字符
的位置。
streamsize 是存儲(chǔ)空間大小的類型,多位long。
重點(diǎn)在返回值的類型,是一個(gè)輸入流類型的應(yīng)用。不是實(shí)際的讀取數(shù)據(jù)的長(zhǎng)度。
要獲得實(shí)際的讀取長(zhǎng)度要調(diào)用 gcount函數(shù)。定義如下
streamsize gcount( ) const;
要獲得當(dāng)前讀取的位置要調(diào)用tellg函數(shù)。定義如下
pos_type tellg( );
想要知道以一共讀取了多少數(shù)據(jù)就可以用這個(gè)函數(shù)。
tellg會(huì)跳過(guò)格式符。即返回的位置是跳過(guò)控制符的。
這就是說(shuō)幾個(gè)gcount的和不一定等于tellg的值。所以
用來(lái)確定讀取位置時(shí)一定要用tellg函數(shù)。而不能用
gcount的和,在偏移,這會(huì)產(chǎn)生不對(duì)的位置。
看下面的例子
int main( int argc, char* argv[] )
{
std::ifstream ifile;
char buf[10];
ifile.open( "example.txt" ); //examplet.txt文件中每行有一個(gè)回車符
ifile.read( buf, 10 );
size_t size = ifile.tellg(); //size為11
size = ifile.gcount(); //size為10
ifile.read( buf, 10 );
size = ifile.tellg(); //size為22
size = ifile.gcount(); //size為10
if( ifile.eof() )
{
return -1;
}
ifile.close();
return 0;
}
讀取過(guò)程中可能會(huì)出現(xiàn)問(wèn)題,流是不保證讀取過(guò)程的完整性。即要讀多少數(shù)據(jù),
在對(duì)到這么多的數(shù)據(jù)后才返回。
這要求編程人員去判斷流的當(dāng)前狀態(tài)。再進(jìn)行下面的處理。
good函數(shù)知道當(dāng)前狀態(tài)是好的。即上一個(gè)操作成功。可以進(jìn)行下一個(gè)操作。
fail函數(shù)表示上一個(gè)操作失敗。但流還沒(méi)有完全破壞,可以進(jìn)行一些處理。
bad函數(shù)表示流被破壞啦,別想了。不要在處理這個(gè)流拉。
eof函數(shù)表示已到流的尾部。不用再往下讀拉。不會(huì)讀出數(shù)據(jù)的。
int main( int argc, char* argv[] )
{
std::ifstream ifile;
char buf[10];
ifile.open( "example.txt" ); //examplet.txt文件中每行有一個(gè)回車符
ifile.seekg( 0, ios::end );
ifile.close();
ifile.open( "example.txt" );
//這是成立的。說(shuō)明狀態(tài)并沒(méi)有應(yīng)為文件的關(guān)閉而改變。只要這個(gè)對(duì)象
//的還活著,他的上一個(gè)狀態(tài)將保持。而起會(huì)對(duì)下面的操作產(chǎn)生影響。
//除非你清除或修改了狀態(tài)。
if( ifile.eof() )
{
ifile.close();
return -1;
}
ifile.close();
return 0;
}
posted on 2007-05-20 12:06
walkspeed 閱讀(890)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
C++語(yǔ)言