http://hi.baidu.com/zyb_debug/blog/item/cdfc2adf9b982451cdbf1a7e.html
streams定义了两个可用于布尔表达式的函数

operator void*()   意义:stream是否出错(相当于!fail())
operator !()       意义:stream是否已出错(相当于fail())

我们可以运用operator void*()在控制结构中简洁测出stream的当前状态:

while (std::cin)
{
}
控制结构中的布尔条件值并不是非得直接转换为bool不可,只要能够转换为某个整数型别或指针型别就够了。
转换为void* 常常是为了在同一表达式中读入对象并测试是否成功:

if(std::cin>> x)
{
//reading x was successful
}
正如先前的讨论,表达式
std::cin >> x
会返回cin,所以读入x后,上述语句变为
if(std::cin)
{
}

此时的cin被用于条件判断,所以cin会调用 operator void*,返回"stream是否发生错误"

以上技术的几个典型应用就是以循环读入对象并处理
while(std::cin >> obj)
{
std:: cout << obj << std::endl;
}

如果failbit或badbit被设立,该循环就立即中止---出现错误或者读到(end-of-file).

我们可以利用operator!进行相反测试,它会返回"strean是否已发生错误",也就是说如果failbit 或badbit被设立就会返回true用法如下:
if(!std::cin)
{
//the stream is not OK
}

上述文字出于 <<c++标准程序库-自修教程与参考手册->>p600 侯捷-孟岩译

花了几天时间终于将这本书阅读完了,里面的streambuf没有理解,是我功底不够的缘故吧...
开学了,人多了起来,继续静静的学习

Posted on 2009-09-06 14:38 zyb_debug 阅读(1936) 评论(3)  编辑 收藏 引用

Feedback

# re: 关于while(cin)  回复  更多评论   

2009-09-06 19:06 by OwnWaterloo
>> 控制结构中的布尔条件值并不是非得直接转换为bool不可,只要能够转换为某个整数型别或指针型别就够了。

选void* 而不是整数类型是有原因的。 可以避免如下代码被编译通过:
cin<< xxx;


streambuf是重点之一。
istream 负责格式化输入, ostream负责格式化输出。
streambuf 如其名那样, 作为格式化结果与最终输出目的地之间的缓存。

而stringstream, fstream, 没有太多的功能。
格式化功能是继承自iostream。
而它们使用的是stringbuf, filebuf, 是streambuf的子类, 提供一些额外功能。
stringstream, fstream比iostream多的功能, 正是其buf提供的。

# re: 关于while(cin)  回复  更多评论   

2009-09-06 20:16 by zyb_debug
@OwnWaterloo
恩 istream ostream里面的文件读取主要是通过streambuf,维护这个东西实现的。
我估计是阅读的太快了,总是感觉有些理解不了。
而且我现在读取文件数据都用的是XML,IO这块没费心。
其实我觉得最有用的是STL里的算法和容器

# re: 关于while(cin)  回复  更多评论   

2009-09-09 23:39 by Chuck
传说有一个版本的cin中是这么来处理转换的

operator int ();

int i;
while ( cin>>i ) {}

那么这一句就会被编译为 cin这个整数值 右移 i位

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理