Копирование файла несколько раз с использованием цикла; C / C ++ - PullRequest
1 голос
/ 25 сентября 2011

Я хотел скопировать файл несколько раз, используя разные имена.

Программа выглядит так:

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

3 голосов
/ 25 сентября 2011

Вы должны открывать и закрывать первый файл в каждой итерации цикла.

....
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";
0 голосов
/ 22 декабря 2016
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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...