2010-02-21 4 views
6

Ich versuche, eine Datei aus einer angegebenen Bibliothek in das aktuelle Verzeichnis zu kopieren. Ich kann Textdateien perfekt kopieren. Alle anderen Dateien werden beschädigt. Das Programm erkennt einen Fehler vorher.Wie liest man eine Binärdatei in c? (Video, Bilder oder Text)

#include <stdio.h> 

int BUFFER_SIZE = 1024; 
FILE *source; 
FILE *destination; 
int n; 
int count = 0; 
int written = 0; 

int main() { 
    unsigned char buffer[BUFFER_SIZE]; 

    source = fopen("./library/rfc1350.txt", "r"); 

    if (source) { 
     destination = fopen("rfc1350.txt", "w"); 

     while (!feof(source)) { 
      n = fread(buffer, 1, BUFFER_SIZE, source); 
      count += n; 
      printf("n = %d\n", n); 
      fwrite(buffer, 1, n, destination); 
     } 
     printf("%d bytes read from library.\n", count); 
    } else { 
     printf("fail\n"); 
    } 

    fclose(source); 
    fclose(destination); 

    return 0; 
} 

Antwort

16

Sind Sie auf einer Windows-Maschine? Versuchen Sie, in den Aufrufen von "b" zu den Moduszeichenfolgen hinzuzufügen.

Von Mann fopen (3):

Der Modus-String auch die Buchstaben enthalten kann ‚b‘ entweder als letztes Zeichen oder als ein Zeichen zwischen den Zeichen in einen der zwei Zeichenkette oben beschrieben. Dies ist ausschließlich für die Kompatibilität mit C89 und hat keine Auswirkungen; Das 'b' wird auf allen POSIX-konformen Systemen, einschließlich Linux, ignoriert. (Andere Systeme können Textdateien und binäre Dateien anders behandeln, und das Hinzufügen des 'b' kann eine gute Idee sein, wenn Sie I/O zu einer binären Datei ausführen und erwarten, dass Ihr Programm in Nicht-Unix Umgebungen portiert werden kann.)
+0

Das hat es behoben. Vielen Dank. –

4

Sie benötigen die "b" Option fopen angeben:

source = fopen("./library/rfc1350.txt", "rb"); 
... 
destination = fopen("rfc1350.txt", "wb"); 

Ohne sie die Datei im Text ("t") Modus geöffnet wird, und dies führt zu einer Übersetzung von End-of-Line-Zeichen .

2

Sie müssen die Dateien im Binärformat anstatt im Textformat öffnen. Verwenden Sie in Ihren Aufrufen zu "rb" und "wb" anstelle von "r" bzw. "w".