#include
#include
using namespace std;
int main()
{
FILE * fin;
FILE * fout;
char src_name[128];
char dst_name[128];
cout<<"请输入源文件的文件名:"<<endl;
cin>>src_name;
cout<<"请输入目标文件的文件名:"<<endl;
cin>>dst_name;
fin = fopen( src_name,"r" );
if( NULL == fin )
{
cout<<"打开源文件失败!"<<endl;
return 0;
}
fout = fopen( dst_name, "w" );
if( NULL == fout )
{
cout<<"打开目标文件失败!"<<endl;
fclose( fin );
return 0;
}
//文件复制
while( true )
{
char buffer[128];
int count = fread( buffer, sizeof(char), 128 , fin );
if( count == 0 )
{
cout<<"读文件错误!"<<endl;
break;
}
int write_count = fwrite( buffer, sizeof(char), count, fout );
if( write_count < count )
{
cout<<"写文件错误!"<<endl;
}
if( feof( fin ) )
break;
}
//关闭文件
if( fclose( fin ) )
{
cout<<"关闭源文件失败!"<<endl;
}
if( fclose( fout ) )
{
cout<<"关闭目标文件失败!"<<endl;
}
cout<<"复制完成!"<<endl;
return 0;
}
建立一个控制台工程,并将上述代码复制到源文件中,编译并运行,其结果如图10-2所示。
[插图]
图10-2 文件复制错误结果
出现这样的结果是因为源文件src.txt不存在,而源文件是以读模式打开的,必须要存在。在工程的目录下新建一个src.txt文件,写一些内容进去,重新运行程序,结果如图10-3所示。
[插图]
图10-3 文件复制正确结果
fopen函数打开一个文件,打开成功,返回文件指针,若失败则返回NULL,因此需要对fopen的返回结果进行判断。同理也要对fread和fwrite的返回结果进行判断,看是否成功。对函数返回结果进行判断,可以大幅提高程序的健壮性,但是也存在很大的局限性,例如:
将用户函数和出错处理程序放在一起,出错程序的编写比较烦琐。也就是说在哪里发现错误,哪里就要处理错误。
使用返回值表现错误,可以传递的信息有限。
错误处理对别人的错误无能为力。比如调用了别人的函数,而该函数中对错误的处理不够完善。