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