请问异常处理中怎样抛出一个ifstream对象

AlwaysSLH 2007-10-02 07:52:27
编程中遇到一个问题,如下一段程序中,filename已定义为string变量,
try
{
ifstream infile( filename.c_str() , ios::in| ios::binary );
if( !infile )
throw infile;
infile.read( (char *) ( &size ) , sizeof( size ) );
infile.read( (char *) ( list ) , sizeof( elemType ) * size );
infile.close();
}
catch( ifstream )
{
cerr<<"InformationDataFile.dat 文件打开失败 !"<<endl;
_getch();
exit( 0 );
}
编译时总是通不过,错误如下:
I:\Microsoft Visual Studio 8\VC\include\fstream(675) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
I:\Microsoft Visual Studio 8\VC\include\ios(151) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
This diagnostic occurred in the compiler generated function 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const std::basic_ifstream<_Elem,_Traits> &)'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
I:\Microsoft Visual Studio 8\VC\include\istream(842) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
I:\Microsoft Visual Studio 8\VC\include\ios(151) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
This diagnostic occurred in the compiler generated function 'std::basic_istream<_Elem,_Traits>::basic_istream(const std::basic_istream<_Elem,_Traits> &)'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
后来发现是 throw infile; 这句的问题,把它去掉就好了,那请问各位高手异常处理中怎样抛出一个ifstream类的对象呢?还是个抛出它的一个什么成员呢?
...全文
328 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlwaysSLH 2007-10-04
  • 打赏
  • 举报
回复
查了点资料,说:文件处理中很少实用普通的异常机制,而是常常采用检查状态位来看读写是否成功或者失败。
这样做就可以了,谢谢各位了
smalllixin 2007-10-04
  • 打赏
  • 举报
回复
#include <fstream >
#include <iostream >
#include <conio.h >
using namespace std;

int main()
{
try
{
ifstream input;
input.open( "a.dat" , ios::in );
if( !input )
throw input;
input.close();
cout < <"Done" < <endl;
}
catch( ifstream )
{
cerr < <"error!" < <endl;
_getch();
exit(0);
}
return 0;
}
手头没有调试环境,只能分析一下。
看了一下错误信息,如果你catch中这样写就是要deep copy一份ifstream对象,这个类的定义应该不允许这样做,导致了编译出现的问题。
话说回来~ C++的异常不是这样写的,也没有抛出这种对象的需求。你要是非得这么做,也可以,大概需要这么写
try
{
ifstream* input = new ifstream;
throw input;
}catch(ifstream* ex)
{
...
delete ex;
}
当然,这样写也会有一些问题,你可以用auto_ptr来解决删除对象的问题。
建议你还是看看书,了解一下C++异常处理的机制。
ranrer 2007-10-03
  • 打赏
  • 举报
回复
我觉得应该抛出一个异常类比较好,而且catch以后你也没有用到infile
ifstream 的Copy constructor 是私有的,这里可能和这个有关系吧
AlwaysSLH 2007-10-03
  • 打赏
  • 举报
回复
高手帮忙呀!!!
AlwaysSLH 2007-10-02
  • 打赏
  • 举报
回复
不好意思,代码太长了,没有注释,而且还没有通过编译,问题还不少,似乎贴出来也不方便看的。
试着写了点测试的,和刚才一样的错误,如下:

#include<fstream>
#include<iostream>
#include<conio.h>
using namespace std;

int main()
{
try
{
ifstream input;
input.open( "a.dat" , ios::in );
if( !input )
throw input;
input.close();
cout<<"Done"<<endl;
}
catch( ifstream )
{
cerr<<"error!"<<endl;
_getch();
exit(0);
}
return 0;
}

错误如下:

I:\Microsoft Visual Studio 8\VC\include\fstream(675) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
I:\Microsoft Visual Studio 8\VC\include\ios(151) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
This diagnostic occurred in the compiler generated function 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const std::basic_ifstream<_Elem,_Traits> &)'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
I:\Microsoft Visual Studio 8\VC\include\istream(842) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
I:\Microsoft Visual Studio 8\VC\include\ios(151) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
This diagnostic occurred in the compiler generated function 'std::basic_istream<_Elem,_Traits>::basic_istream(const std::basic_istream<_Elem,_Traits> &)'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]

vs2005下调的
tangshuiling 2007-10-02
  • 打赏
  • 举报
回复
单从楼主的这段代码来看,try{}和catch(){}语法上并没有什么错误,应该是其他的代码并发性问题,请贴全代码!!!

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧