Wie Binärdatei einlesen,auswerten und in neue (Text-)Datei schreiben?
-
Hallo zusammen!
Ich versuche gerade eine Binärdatei (läßt sich mit einem Hex-Editor öffnen und ansehen) in "C" zu öffnen, bestimmte Werte (!=0) auszulesen und diese in eine neue Datei im ASCII Format zu schreiben. Ich habe es bisher schon geschafft, die Datei zu öffnen und irgendwas auszulesen, aber nicht den Inhalt der Datei geschweige denn in eine neue zu schreiben. Ich habe mich am "C von A bis Z" versucht und habe mir auch ein Buch gekauft "C Einführung und profesionelle Anwendung" aber die Kapitel mit den Dateioperationen verstehe ich noch nicht so richtig. Gibt es hierzu vielleicht noch weitere Literatur oder Hilfen im Netz? Schon mal vielen Dank für Eure Hilfe.
jdb78
#include <stdio.h> #include <stdlib.h> char use[] = "\nBenutzung: fcopy [Quelle] [Ziel]\n"; int main (int argc, char **argv) { FILE *quelldatei, *zieldatei; //Zeiger fuer Dateioperationen anlegen unsigned short filesize; //Variablen deklarieren int i; /* Es folgt die Sicherheitsabfrage, ob das Programm mit allen benötigten Parametern aufgerufen wurde, die es braucht und ob die Quelldatei existiert */ switch (argc) { case 1: quelldatei = stdin; zieldatei = stdout; fprintf (stderr, use); return 0; break; case 2: quelldatei = fopen (argv[1], "r"); zieldatei = stdout; fprintf (stderr, use); return 0; break; case 3: if ((quelldatei = fopen( argv[1],"r+b")) != NULL) zieldatei = fopen( argv[2],"w"); break; default: fprintf (stderr, use); exit(1); // Falscher Aufruf } if (quelldatei == NULL) fprintf (stderr,"Fehler beim Oeffnen von %s\n", argv[1]), exit(2); // Quelldatei nicht geoeffnet if (zieldatei == NULL) fprintf (stderr, "Fehler beim Oeffnen von %s\n", argv[2]), exit(3); // Zieldatei nicht geoeffnet // Groesse der Quelldatei bestimmen fseek(quelldatei, 0L, SEEK_END); filesize=ftell(quelldatei); printf("Die Datei %s ist %ld Bytes gross.\n",argv[1], filesize); // nur für mich zum Verständnis fseek(quelldatei, 0L, SEEK_SET); printf("Der Datenzeiger steht bei %ld \n", ftell(quelldatei)); unsigned short puffer[filesize]; fread(&puffer, sizeof(char), filesize, quelldatei); for(i = 0; i < filesize; i++) { if (i !=0){ printf ("Wert %x: %x", i, anzahl[i]); } } // fwrite(&puffer, sizeof(int),filesize,zieldatei); printf("Fertig"); // Dateien wieder schliessen fclose (quelldatei); fclose (zieldatei); return 0; }
-
FILE *in, *out; in = fopen(argv[1], "rb" ); out = fopen(argv[2], "wb"); int buf; while( (buf = fgetc(in) ) != EOF) fputc(buf, out); fclose(in); fclose(out);
-
Danke schoen fuer die Antwort! Leider kopiert dieses Listing aber die binaeren Daten in eine binaere Datei. Ich benoetige eine ASCII Datei, daher der ganze Aufwand ueberhaupt.
Also Quelle: laesst sich nur mit HEX Editor ankucken, Ziel soll mit einem ASCII Editor zu lesen sein.
-
Es gibt C-funktionen um so was zu prüfen - man isprint hilft da
weiter - außerdem sind die ascii zeichen nur in einem Bereich
vorhanden - ich glaub das war 0 - 127 dezimal und ein einzelner char
in C ist auch ein ein-Byte ind. Du kannst jeden char auf >= 0 und <= 127
abfragen und nur dann schreiben, wenns passt.
-
Ups, entschuldigung.
Wie mein Vorredner sagt, ist der ASCII-Satz begrenzt. Das heißt, sobald die Grenze bei 127 überschritten ist, können die Bytewerte nicht mehr auf druckbare Zeichen abgebildet werden. Du müsstest dann den Zeichensatz erweitern (auf bspw. Unicode) oder du schaust für jeden Bytewert in deiner "Format-Spezifikation" nach und schreibst dann entsprechend etwas auf den Bildschirm (z. B. "FileHeader:begin" oder sowas). Oder du jagst die Binärdatei durch einen Base64-Kodierer, wie das bei E-Mail-Anhängen passiert. Erklär uns aber am Besten nochmal, für was du das brauchst.
-
Nix zu entschuldigen! Ich habe zu danken.
Also nochmal Schritt fuer Schritt:
ich habe eine Datei, die sich nur mit einem HEX-Editor vernuenftig auswerten laesst. Dort finden sich Werte von 0x00 bis 0x0c. Diese Werte haette ich gerne als Zahlen 0 bis 12 mit Komma getrennt in eine Datei geschrieben, die sich mit einem herkoemmlichen Texteditor lesen laesst.
Mittlerweile bin ich durch die Hilfe eines netten Menschen auf die Loesung gekommen. Die Streams einzulesen und hinein zu schreiben bringt nichts. Wenn man mit freopen die stdin und stdout umleitet (Quell- respektive Zieldatei) dann funktioniert das wunderbar, dann kann man naemlich formatiert ausgeben. Vorher habe ich mir immer die Steuerzeichen eingebrockt (Werte 0 bis 12) und damit keine ASCII kompatible Ausgabe erhalten.
Vielen Dank noch mal fuer Eure Hilfe!
-
Hm, dann war die Frage nicht ganz eindeutig. Die Zahlen 1 bis 12 haben mit ihren Entsprechungen in ASCII (ihrer Zifferndarstellung) erst einmal nichts zu tun. Für die Konversion musst du 48 aufaddieren.