IO库的一些知识

         标准io库类型和头文件

iostream 对流进行读写

fstream 对文件进行读写

sstream 对string对象进行读写

一.IO对象不可复制或赋值

eg:

ofstream out1,out2;

out1=out2; // error : cannot assign stream objects

//print functions:parameter is copied

ofstream print(ofstream)

out2=print(out2); // error: cannot copy stream objects

这里要求有两种特别重要的含义,只有支持复制的元素类型可以存储在vector或其他容器类型里,由于流对象不能复制,因此不能存储在vector(或其他)容器中,即不存在存储流对象的vector或其他容器)

第二个含义是:形参或返回类型也不能为流类型,如果需要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用: //ps: 函数的形参为指针时,此时复制的是实参的指针,而不是本身。

ofstream &print(ofstream&); //OK: take a rerferce,no copy;

while(print(out2)) { /* ,...*/} // ok: pass referce to out2

一般情况下,如果要传递IO对象以便对它进行读写,可用非const引用的方式的方式传递这个流对象,对IO对象的读写会改变它的状态,因此引用必须是非const的。

二,流状态的查询和控制

可用管理如下输入操作

int ival;

//read cin and test only for EOF:loop is executed even if there are other IO failures) 读取cin而且仅仅测试是否为eof错误,即使cin错误也是可用执行的

while(cin>>ival,!cin.eof())

{

if(cin.bad())

throw runtime_error(" IO stream corrupted");

if(cin.fail())

{

cerr<<" bad data,try again":

cin.clear(istream::failbit);

continue;

}

// ok to process ival;

}

这个循环不断读入cin,直到到达文件结束符或者发生不可恢复的读取错误为止,循环条件使用了逗号操作符,首先计算它的每一个操作数,然后返回最右边操作数作为整个操作的结果,因此,循环条件只读入cin而忽略了其结果,该条件的结果是!cin.eof()的值,如果cin到达了文件的结束符,条件则为假,退出循环,否则不管怎样将进入循环。

在循环中,先检查流是否被损坏,如果是的话,抛出异常并退出循环,如果输入无效,则输出警告并清除failbit状态,在本例中,执行continue语句回到while的开头,读入另一个值给ival,如果没有出现任何错误,那么循环体余下的部分即可正常的使用ival。

三。缓冲区的管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值