输入流的读取多个字符的操作多用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 阅读(872)
评论(0) 编辑 收藏 引用 所属分类:
C++语言