#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的返回结果进行判断,看是否成功。对函数返回结果进行判断,可以大幅提高程序的健壮性,但是也存在很大的局限性,例如:

将用户函数和出错处理程序放在一起,出错程序的编写比较烦琐。也就是说在哪里发现错误,哪里就要处理错误。

使用返回值表现错误,可以传递的信息有限。

错误处理对别人的错误无能为力。比如调用了别人的函数,而该函数中对错误的处理不够完善。