2016-05-22 6 views
-2

Ich habe einen C-Code zum Kopieren von Dateidaten von einem zum anderen geschrieben. Der folgende Code funktioniert gut.aber Compiler zeigt immer noch eine falsche Antwort, da die Ausführungszeit ist seine 280.0, ist unten Mein CodeC Programm-Datei kopieren

#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

fertig sind und die Kopie ist ein Byte größer als das Original? – wildplasser

+0

Können Sie das Problem etwas besser beschreiben? –

+5

BTW [fgetc] (http://linux.die.net/man/3/fgetc) gibt eine Ganzzahl zurück - also gibt es einen Fehler –

Antwort

1

Ihr Programm wird immer das EOF-Zeichen ausgeben.

fgetc gibt tatsächlich kein Zeichen zurück, sondern ein int. EOF ist eigentlich -1. Wenn Sie es schreiben, wird ein zusätzliches Byte (0xFF) in die Ausgabedatei geschrieben.

Ein korrekter Code wäre wie:

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

Sie für diesen Code ist argumentieren könnte (in) Eleganz, aber der Punkt ist, dass Sie sollten nicht Druck der EOF-Zeichen.

1

ich fread empfehlen, mit einem bedeutenden Teil (mindestens 4096 Bytes oder sogar so viel wie 1MB) der Eingabedatei lesen und schreiben dann diese Brocken in die Ausgabedatei mit fwrite. Das kann helfen, die Zeit zu sparen, die auf seek time and rotational latency auf einer sich drehenden Festplatte verschwendet wird.

Etwas wie folgt aus:

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); 
    } 
} 

Und natürlich sollten Sie die Probleme beheben, die in den Kommentaren erwähnt @WeatherVane.

  • Haupt sollte als int main(void)
  • nie gets verwenden fgets statt
  • immer überprüfen Sie den Rückgabewert von fopen verwenden deklariert werden. Es kann und wird fehlschlagen, z.B. Wenn die Eingabedatei nicht vorhanden ist, oder Sie keine Schreibberechtigung für die Ausgabedatei
  • sicher sein, die Dateien mit fclose schließen müssen, wenn Sie mit ihnen
Verwandte Themen