【问题标题】:Copying a file multiple times using loop; C/C++使用循环多次复制文件; C/C++
【发布时间】:2011-09-25 13:34:00
【问题描述】:

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

程序是这样的:

#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。

我怎样才能使代码工作?

【问题讨论】:

  • 其实这不是错误,即编译器没有显示任何错误。坏的。这可能是一个错误......第二次,我得到输出:来自这个 if 语句的错误 2:if((fp2=fopen(text.c_str(), "wb"))==NULL)
  • @user817824 更新了我的回复
  • 您正在使用 C++ 类。为什么不使用 fstream 而不是 C 文件函数?
  • 我还没有学过 C++ 文件 I/O。 :(
  • @Griwes 这个问题中的任何问题都不能通过切换到 C++ 文件结构来解决

标签: c++ file copy


【解决方案1】:

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

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

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

编辑:新问题:

您需要重置字符串流。在第二次迭代中,您尝试打开

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";

【讨论】:

  • 这解决了另一个我还没有考虑过的问题。多谢了。但是我遇到的问题仍然存在。在输出中我得到: Error 2 这意味着,在这个 if((fp2=fopen(text.c_str(), "wb"))==NULL) { cout
【解决方案2】:
int main()
{
    string text;
    int i;
    char ch;
    ostringstream oss;
    FILE *fp1,*fp2;

    if((fp1=fopen("/home/maru/fact.cpp", "rb"))==NULL)
    {
        cout<<"Error";
        exit(-1);
    }

    for(i=1; i<=5; i++)
    {
        oss << "/home/maru/fact" << i << ".cpp";
        text = oss.str();

     rewind(fp1);

     cout<<text<<"\n";

     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);
       oss.str("");

    }
    fclose(fp1);
    return 0;
}

【讨论】:

  • 请在您的答案中添加一些 cmets 或直接添加到您的源代码中,以解释您的解决方案与问题匹配的原因。
  • 同时读取Why is “while ( !feof (file) )” always wrong? 您发布的代码会将读取的最后一个字符从fp1 写入fp2 两次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多