fstream对象重复使用时注意clear()的调用

fstream对象重复使用时注意clear()的调用,否则会造成打开第二个文件失败。这是因为一个fstream对象对应磁盘上的
一个文件,这种绑定关系在调用open()函数或者构造函数时指定,但有时我们会重复使用同一个fstream对象先后绑定不同
文件,在两次绑定中间仅仅调用close()是不够的(当然对close()的调用是必须的,每次打开文件使用完毕都必须关闭文件),
因为close()函数并不会重置fstream的条件状态,如果先前的某个操作失败了,那么failbit的状态会一直保留下来,接下来
对于条件状态的判断也一定是失败的,因此在使用同一个fstream对象绑定第二个文件之间需要调用clear()函数重置流的条件
状态。

//y.txt不存在,x.txt存在
//注:此程序需在vs下运行才可得到理想结果,DEV应该是进行了优化,它的编译器应该是在将流对象与文件相关联时,自动重置了流状态
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream fin("y.txt");
    if(fin.fail())                //由于y.txt不存在,因此failbit为1,fin.fail()返回true
        cout<<"fail to open y.txt"<<endl;
    fin.close();

    fin.open("x.txt");            //由于x.txt存在,因此关联文件成功
    cout<<fin.is_open()<<endl;    //打开文件成功,fin.is_open()返回true(注:如果x.txt不存在,则打开文件失败,返回false)
    cout<<fin.bad()<<endl;        //并没有非法操作流,因此fin.bad()返回false
    if(fin.fail())                //由于failbit为1,因此fin.fail()继续返回true
        cout<<"fail to open x.txt"<<endl;
    fin.close();
    return 0;
}
时间: 2024-10-11 10:32:44

fstream对象重复使用时注意clear()的调用的相关文章

java对象不再使用时赋值null的意义

先看代码 public class TestDemo1 { public static void main(String[] args) { if (true) { byte[] placeHolder = new byte[64 * 1024 * 1024]; System.out.println(placeHolder.length / 1024); } System.gc(); } } idea配置gc日志打印 运行上面的代码,载图gc日志 现在我们修改上面的测试代码,将 placeHol

getContext在谷歌浏览器中,使用时要先加载canvas对象,否则会提示&#39;getContext is null&#39;

<body> <canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;"> Your browser does not support the canvas element. </canvas> <script type="text/javascript">

android Fragment 使用时的技巧

android 从3.0开始引入了Fragment逐渐的取代了tabhost与GroupActivity,但是在使用中发现有些细节上的处理:通过Activity管理Fragment,我们需要关心以下的几个 问题: 1:防止Fragment的重复创建 2:怎么使用add还是使用replace来添加 以上的两个问题其实有好的方式来替代,那就是使用FragmentPagerAdapter来管理控制: demo代码不多,会全部的贴出来如下:重点部分通过颜色的标识进行的区分 activity_main.x

实战Java内存泄漏问题分析 -- hazelcast2.0.3使用时内存泄漏 -- 1

公司当年有一个自己缓存集群用户session的Java library,是基于hazlcast2.0.3实现的,最近在customer site集群环境中某个blade报了Out of Memory Exception, 其他blades都正常,马上用jrockit jrcmd命令dump了堆和线程进行分析. printf "##################### heap ##################\n" su -p occas -c "/opt/jrocki

实战Java内存泄漏问题分析 -- hazelcast2.0.3使用时内存泄漏 -- 2

hazelcast 提供了3中方法调用startCleanup: 第一种是在ConcuurentMapManager的构造函数中,通过调用node的executorManager中的ScheduledExecutorService来创建每秒执行一次cleanup操作的线程(代码如下).由于这是ConcuurentMapManager构造函数的代码,所以这种调用startCleanup的操作是默认就会有的. node.executorManager.getScheduledExecutorServ

DotNetBar.Bar作为容器使用时Text更新原理

DotNetBar.Bar作为容器使用时Text更新原理 老帅 控件DevComponents.DotNetBar.Bar是可以有多种用途的,其中一种是用作容器,如下图的SQLServer管理器,就是一个容器,容器里面存在两个页面"对象资源管理器详细信息"和"对象资源管理器",这两个页面上又分别容纳了多种控件. 想让DevComponents.DotNetBar.Bar作为容器使用,其属性配置如下: 此时,Bar中会有一个容器项目DockContainerItem,

protobuf在使用时出现的问题小汇总

文章开头放一下IBM的google protocol buffer的介绍链接.http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ 对于这种技术不断更新的东西,我只能这么理解:因为技术在更新,版本在变化,之前很详尽的技术博文可能在之后的版本中遇到无法预知的问题,所以我们在使用时要注意甄别.废话不多说,进入正文部分. 安装什么的都是小问题了,还是贴一下步骤吧. tar -xzf protobuf-2.5.0.tar.gz cd protobuf-

Android Loader使用时,屏幕解锁后,重复加载

在使用AsyncTaskLoader时,当手机解锁后,会重复加载数据,代码如下: static class CouponShopQueryLoader extends AsyncTaskLoader<List<CouponStore>> { private int couponId; public CouponShopQueryLoader(Context context, int couponId) { super(context); this.couponId = coupon

C++ NULL 与 空字符串 在使用时的注意点

在这不做 理论上的 释疑,只是提供示例代码 int main() { char *p=NULL; if (p==NULL) // { p="p is NULL pointer"; } printf("%s\n",p); return 0; } //此处说明:在定义 指针p的同时使用 NULL 对p进行初始化,若是在比较的时候用 p[0] == '\0' 则会报错//   原因是 p不指向任何变量,对p进行[]操作非法//   变量所指的范围 包括 普通的内置变量,自