VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 757|回复: 5

C++文件流对象的问题

[复制链接]

4

主题

16

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-1-27 16:40:01 | 显示全部楼层 |阅读模式
用同一个文件流对象ifstream in_stream; 打开多个文件,打开一个读取完后将其关闭然后又用它来打开另一个,关闭,当打开到第三个文件时就失败了,为什么呢?
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-2-21 12:00:02 | 显示全部楼层
把代码帖一下吧,应该不会的。
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-2-21 12:45:01 | 显示全部楼层
流对象内部保留了状态的,也许需要调用clear、seek、ingore等接口重置状态。

最好别重用变量。
回复

使用道具 举报

4

主题

16

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-3-2 16:45:01 | 显示全部楼层
代码:
ifstream in_stream;

  in_stream.open("进货库.txt");
  if(in_stream.fail())
  {
      cout<<"Opening file fail 1111!"<<endl;
      exit(1); //异常退出
  }

  string strtemp;
  int    i;
  
  string strGoodsName; //货名
  string strModelNum;  //商品型号
  string strGoodsNum;  //货号
  int    nCount;       //商品数量   
  double dwPrice;      //商品进货价格(单价)
  double dwProfits;    //商品利润()
  string strProvider;  //供货商
  string strManName;   //经办人
  
  //下面是初始化进货库
  in_stream.seekg(0,ios::beg);

  for(i=0;i<8;i++)
          in_stream>>strtemp;  //将第一行忽略掉
  for(i=0;i<12;i++)  //正式读取内容
  {   
          in_stream>>strGoodsName>>strModelNum>>strGoodsNum>>nCount>>dwPrice
                    >>dwProfits>>strProvider>>strManName;

           m_InWareHouse.Add(CMerchandise(strGoodsName,strModelNum,strGoodsNum,nCount,
                           dwPrice, dwProfits,strProvider,strManName));
  }

  in_stream.close();

  //下面是初始化库存
  in_stream.open("库存.txt");
  if(in_stream.fail())
  {
      cout<<"Opening file fail  2222!"<<endl;
      exit(1); //异常退出
  }
  
  in_stream.seekg(0,ios::beg);

  for(i=0;i<7;i++)
          in_stream>>strtemp;  //将第一行忽略掉

   for(i=0;i<12;i++)  //正式读取内容
  {   
          in_stream>>strGoodsName>>strModelNum>>strGoodsNum>>nCount>>dwPrice
                    >>dwProfits>>strProvider;

           m_InWareHouse.Add(CMerchandise(strGoodsName,strModelNum,strGoodsNum,nCount,
                           dwPrice, dwProfits,strProvider," "));
  }

  in_stream.close();

  //下面是初始化销售库
  
   in_stream.open("销售库.txt");

  if(in_stream.fail())
  {
   cout<<"Opening file fail 3333!"<<endl;
      exit(1); //异常退出
  }

  in_stream.seekg(0,ios::beg);

  for(i=0;i<7;i++)
          in_stream>>strtemp;  //将第一行忽略掉

   for(i=0;i<12;i++)  //正式读取内容
  {   
          in_stream>>strGoodsName>>strModelNum>>strGoodsNum>>nCount>>dwPrice
                    >>dwProfits>>strProvider;

           m_InWareHouse.Add(CMerchandise(strGoodsName,strModelNum,strGoodsNum,nCount,
                           dwPrice, dwProfits,strProvider,""));
  }

   in_stream.close();
  
基本代码就是上面的,运行结果是显示 “Opening file fail 3333!”
回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-3-5 21:00:02 | 显示全部楼层
同意 superandy  
close之后加一句:
in_stream.clear();
清除所有状态标志

in_stream.fail()返回true,说明failbit或badbit被设立了。而当in_stream读取到
end-of-file时会同时设立eofbit和failbit
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-19 15:00:01 | 显示全部楼层
原来是这样啊,明白了,原来我也遇到过这个问题,一直不甚明白,试验一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表