使用循环多次复制文件; C / C ++

时间:2011-09-25 13:34:00

标签: c++ file copy

我想使用不同的名称多次复制文件。

该计划是这样的:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include <sstream>
#include<cstring>
using namespace std;

main()
{
    string text;
    int i;
    char ch;
    ostringstream oss;
    FILE *fp1,*fp2;
    if((fp1=fopen("One Dollar.jpg", "rb"))==NULL)
    {
        cout<<"Error";
        exit(-1);
    }
    for(i=1; i<=5; i++)
    {
        oss << "C:\\5241 Dollar\\One Dollar " << i << ".jpg";

        text = oss.str();

        if((fp2=fopen(text.c_str(), "wb"))==NULL)
        {
            cout<<"Error "<<i;
            exit(-1);
        }
        while(!feof(fp1))
        {
            fread(&ch, 1, 1, fp1);
            fwrite(&ch, 1, 1, fp2);
        }

        fclose(fp2);

       /* for(int j=0;j<30000;j++)
            for(int k=0;k<30000;k++)
                if(k==3000)
                    cout<<k; */

    }
    fclose(fp1);
}

在这里有两个文件流,其中一个是源,另一个是目的地..我以二进制读取模式加载实际文件,目标作为二进制写入模式。我使用for循环来完成工作。但是一旦循环迭代第二次,fp2的文件打开就会失败。我得到了输出:错误2。

如何使代码生效?

2 个答案:

答案 0 :(得分:3)

您应该在循环的每次迭代中打开和关闭第一个文件。

....
for(i=1; i<=5; i++)
{    
    if((fp1=fopen("One Dollar.jpg", "rb"))==NULL)
    {
        cout<<"Error";
        exit(-1);
    }
....

原因是因为在第一次迭代结束时,第一个文件指针位于文件的末尾,因此在第二次迭代时不会看到任何数据。你必须关闭并重新打开文件(或者你可以使用seek跳转到文件的前面,但这是一个更简单的更改,因为它是复制粘贴的)

编辑:对新问题:

你需要重置stringstream。在第二次迭代中,您尝试打开

C:\\5241 Dollar\\One Dollar 1.jpgC:\\5241 Dollar\\One Dollar 2.jpg

无效。

一种解决方案是将ostringstream声明带入循环:

....
for(i=1; i<=5; i++)
{    
    if((fp1=fopen("One Dollar.jpg", "rb"))==NULL)
    {
        cout<<"Error";
        exit(-1);
    }
    ostringstream oss;
    oss << "C:\\5241 Dollar\\One Dollar " << i << ".jpg";

答案 1 :(得分:0)

fill_parent