2016-05-22 96 views
-2

我已經寫了一個C代碼從一個複製文件數據another.The下面的代碼仍然是工作fine.but編譯器顯示了它的一個錯誤的答案,執行時間是高的280.0,下面是我的代碼C程序文件複製

#include<stdio.h> 
int main() 
{ 
    FILE *fp1,*fp2; 
    char ch,fname1[20],fname2[20]; 
    printf("Enter the input file name\n"); 
    gets(fname1); 
    printf("Enter the output file name\n"); 
    gets(fname2); 
    fp1=fopen(fname1,"r"); 
    fp2=fopen(fname2,"w"); 
    do 
    { 
     ch=fgetc(fp1); 
     fputc(ch,fp2); 
    } 
    while(ch!=EOF); 
    return 0; 
} 
+3

完成,副本是一個字節比原來大? – wildplasser

+0

你能更好地描述問題嗎? –

+5

BTW [龜etc(http://linux.die.net/man/3/fgetc)返回一個整數 - 所以有一個錯誤 –

回答

1

您的程序將始終輸出EOF字符。

fgetc實際上不返回字符,而是一個int。 EOF實際上是-1。當你寫它時,一個額外的字節(0xFF)被寫入輸出文件。

正確的代碼將是這樣的:

while ((ch = fgetc(fp1)) != EOF) 
{ 
    fputc(ch,fp2); 
} 

你可以認爲這個代碼的(中)優雅,但問題是,你應該打印EOF字符。

1

我建議使用fread讀取顯著組塊中的輸入文件的(至少4096字節,或者甚至高達1MB),然後寫該塊的輸出文件以fwrite。這可以幫助減少高速旋轉的硬盤上的浪費seek time and rotational latency的時間。

事情是這樣的:

size_t n; 
size_t bufsize = 1024 * 1024;   // one megabyte buffer size 
void *buffer = malloc(bufsize); 
if (buffer != NULL) { 
    while ((n = fread(buffer, 1, bufsize, fp1)) != 0) { 
     fwrite(buffer, 1, n, fp2); 
    } 
} 

,當然還有,你應該修復@WeatherVane在評論中提到的問題。

  • 主要應被聲明爲int main(void)
  • 從不使用gets,使用fgets代替
  • 總是從fopen檢查返回值。它可以並且確實會失敗,例如如果輸入文件不存在,或者您不具有寫權限的輸出文件
  • 一定要與fclose關閉文件時,你與他們