2016-05-04 8 views
-3

Ich habe ein Problem beim Kopieren von Binärdateien fread und fwrite mit: die Schleife läuft nur zweimal (40 Bytes), aber die Dateilänge beträgt 160 Bytes:Kopieren Binärdateien fread mit und fwrite

#include <string.h> 
#define PER_READ 30 
int main(void) 
{ 

    char buffer[500] = { 0 }; 
    FILE* CSV = fopen("CSV.csv", "rb"); 
    FILE* csvDest = fopen("CSVDest.csv", "wb"); 
    unsigned int finished = 0; 
    unsigned int counter = 0; 
    do 
    { 
     finished = fread(buffer, sizeof(char*), PER_READ, CSV);//Read all from CSV to a string name buffer 
     finished += PER_READ * counter; 
     counter++; 
    } while (finished == PER_READ * counter); 
    fwrite(buffer, sizeof(char*), finished, csvDest);// write all to a the file CSVDest 

    system("PAUSE"); 
    return (0); 
}; 
+0

Problem? Welches Problem, (abgesehen von Code-Formatierung)? –

+0

Ich habe Ihren Codeblock repariert und am Ende den falschen Backtick entfernt. –

+0

Warum schreibst du (..., sizeof (char *), ...) von allen Dingen? – EOF

Antwort

0
#include <string.h> 
#include <stdio.h> 
#define PER_READ 30 
int main(void) 
{ 
    char buffer[500] = { 0 }; 
    FILE* CSV = fopen("CSV.csv", "rb"); 
    FILE* csvDest = fopen("CSVDest.csv", "wb"); 
    unsigned int finished = 0; 
    unsigned int counter = 0; 
    unsigned int numBlocksRead = 0; 
    do 
    { 
     numBlocksRead = fread(buffer, sizeof(char), PER_READ, CSV); 
     finished += numBlocksRead*sizeof(char); 
     counter++; 
     fwrite(buffer, sizeof(char), numBlocksRead, csvDest); 

    } while (finished == PER_READ * counter); 

    fclose(CSV); 
    fclose(csvDest); 
    system("PAUSE"); 
    return (0); 
} 
+0

Seine 160bytes, Ur-Code funktioniert, aber es fehlt die letzte Zeile der CSV-Datei –

+0

@OriVagmon Ich denke, die letzte Bearbeitung, die ich getan habe, sollte funktionieren. –

+0

Ur-Code nicht kompiliert, also habe ich versucht, es zu beheben, IT noch nicht funktionieren. Hier ist Ihr aktualisierter Code (den ich versucht habe zu beheben): ich werde Ihren Kommentar bearbeiten –

0

Sie tun:

finished = fread(buffer, sizeof(char), PER_READ, CSV); 
finished += PER_READ * counter; 

und dann vergleichen Sie:

while (finished == PER_READ * counter);

wie soll das ausgehen?

+1

Denn wenn die Datei gelesen wird, ist fertig nicht genau 30. –

1

Ihre Implementierung könnte eine einfache Schleife wie diese sein, die wiederholt wird, bis keine Bytes mehr gelesen wurden. Beachten Sie, dass sizeof(char*) falsch ist - die Größe eines Zeigers und dass sizeof(char) per Definition 1 ist.

#include <stdio.h>            // include proper header 

#define BUFFSIZE 512           // power of 2 is kind to system 

int main(void) 
{ 
    char buffer[BUFFSIZE]; 
    size_t bytes; 
    FILE *fin, *fou; 
    fin = fopen("CSV.csv", "rb"); 
    fou = fopen("CSVDest.csv", "wb"); 
    if(fin == NULL || fou == NULL) 
     return 1;            // or other action 
    while ((bytes = fread(buffer, 1, BUFFSIZE, fin)) != 0) { 
     if(fwrite(buffer, 1, bytes, fou) != bytes) { 
      return 1;           // or other action 
     } 
    } 
    fclose(fou); 
    fclose(fin); 
    return 0; 
} 
+0

Danke! Kann ich unsigned int anstelle von size_t verwenden? –

+0

Bitte ignorieren Sie meine letzte Frage. Ur-Code hat perfekt funktioniert, aber können Sie mir bitte helfen, meine Fehler in Mein Code herauszufinden? –

+0

Der offensichtlichste Fehler ist, 'sizeof (char *)' zu verwenden, wenn Sie 'sizeof (char)' meinten. Ein anderes * könnte * sein, dass die Dateigröße nicht ein Vielfaches von 30 Bytes sein darf. Als nächstes versuchen Sie, die ganze Datei in einen Puffer zu schreiben, bevor Sie etwas davon schreiben. Aber anstatt mit Ihrem verschachtelten Versuch zu kämpfen, zeigt dies, wie man es einfach hält. Beachten Sie, dass 'size_t' der Typ ist, der von' fread' zurückgegeben wird und der erforderliche Typ für zwei der Argumente für 'fwrite' ist. –