2011-09-25 26 views
1

我想用不同的名稱複製文件多次。使用循環多次複製文件; C/C++

該程序是這樣的:

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

我該如何使代碼工作?

+0

有什麼錯誤? – Mark

+0

其實這不是錯誤,即編譯器不顯示任何錯誤。由壞。這可能是一個bug ... 第二次,我得到的輸出:錯誤2 從這個if語句:if((fp2 = fopen(text.c_str(),「wb」))== NULL) – ponir

+0

@ user817824更新了我的回覆 –

回答

3

您應該在循環的每次迭代中打開並關閉第一個文件。

.... 
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

這解決了另一個問題,噸認爲尚未Thatnks對於 但是我有遺體 在輸出的問題我得到:。 錯誤2 這意味着,在這種 如果((FP2 =的fopen(text.c_str(),「WB 「))== NULL){ COUT <<」 錯誤「<< I; 出口(-1);} 在第二迭代中的文件打開失敗 – ponir

+0

@use。 r817824已更新 –

+0

謝謝。這工作完美。 :D – ponir

0
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; 
} 
+2

請在回答中或直接在您的源代碼中添加一些註釋,以解釋您的解決方案爲何與問題匹配。 –

+1

並且閱讀[爲什麼是「while(!feof(file))」總是錯誤?](http:// stackoverflow。com/questions/5431941/why-is-while-feof-file-always-wrong)您發佈的代碼會將從fp1到fp2 *的最後一個字符寫入兩次*。 –