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

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(4)

随笔分类(64)

随笔档案(58)

文章分类(3)

文章档案(3)

相册

收藏夹(9)

C++零碎

好友

搜索

  •  

积分与排名

  • 积分 - 159886
  • 排名 - 163

最新评论

阅读排行榜

评论排行榜