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