Dateien unformatiert einlesen und formatiert speichern
-
Hallo an alle!
Ich habe ein Problem / Schwierigkeiten mit der Dateiverarbeitung in C/C++. Ich möchte eine unformatierte Datei einlesen, die dort enthaltenen Daten mit einer Formatierung versehen und die formatierten Daten in einer neuen Datei speichern. Am linken Rand der Zeile sollen Indizes stehen, die "Mitte" wird von Hex Werten eingenommen und am rechten Rand soll, falls möglich, die ASCII Interpretation der Hexzeichen zu finden sein. Punkte stellen dort(in der Interpretation) nicht darstellbare Zeichen dar. Nach der Formatierung sollen die Zeilen zum Beispiel so aussehen:
0000 EB 3C 90 4D 53 44 4F 53-35 2E 30 00 02 01 01 00 .<.MSDOS5.0.....
Tja - wie mache ich das? Zu den Randbedingungen: ich kann (es ist erlaubt - guter Stil hin oder her) C und C++ Methoden nutzen. C Funktionen wären angeblich einfacher?! Wie lese ich am Besten ein: zeichenweise, blockweise oder zeilenweise? Muss ich die Daten zwischenspeichern oder kann ich durch eine C/C++ Methode bereits formatiert in die Datei schreiben? Welche Funktionen benutzt man hierfür am Klügsten? Sind vielleicht irgendwem Code Beispiele bekannt, die ich mir mal anschauen könnte? Um das ganze zusammenzufassen: was mir die größten Probleme bereitet, ist die Formatierung.
Ich muss ehrlich sagen, dass mir das Ganze im Moment sehr nebulös vorkommt - ich weiss nicht so recht, wo ich ansetzen muss.
Für ein paar Tips wäre ich echt sehr dankbar!
mfG Kai
-
Hi Kai!
#include <fstream> #include <iomanip> int main () { using namespace std; ifstream ein ("c:\\skype_BHEU06.handout.pdf", ios::binary); ofstream aus ("c:\\aus.txt"); char buf[16]; const char endz[] = {" "}; unsigned char tmp; for (unsigned short ccc = 0; ein.good(); ccc += 16) { aus << setw(4) << setfill('0') << uppercase << hex << ccc << ' '; int i; for (i = 0; i < 16; i++ ) { ein.read ((char*)&tmp, 1); if (!ein.good ()) break; aus << setw(2) << setfill('0') << hex << (int)tmp; (tmp >= 32 && tmp < 127 ) ? buf[i] = tmp : buf[i] = '.'; i != 7 ? aus << ' ' : aus << '-'; } if (i < 16) aus.write (endz, (16 - i)*3); aus.write (buf, i); aus << endl; } }

-
Hallo Osterhase!

vielen Dank für deine Mühe - leider funzt das nicht. Eine Zeile (als Bsp.) der betreffenden Datei sieht im Windows Editor wie folgt aus(ich denke, dass er das nicht korrekt darstellen kann):
<MSDOS5.0 à @ð )¸".DISK 1FAT12 ú3ÀŽÐ¼ |»x ...usw....Es sind also eine ganze Menge an nicht darstellbaren Zeichen enthalten. Was man erkennen bzw. lesen kann (MSDOS5.0, DISK 1FAT32) ist die ASCII Interpretation der nicht darstellbaren Zeichen. Nachdem das dann formatiert wurde, soll es so aussehen:
0000 EB 3C 90 4D 53 44 4F 53-35 2E 30 00 02 01 01 00 .<.MSDOS5.0.....
ein Index Hex Codierung des Inhaltes ASCII Interpret.So wie ich das sehe, muß der Index hinzugefügt werden, der Rest steht bereits in der Datei.
Wenn jemand noch ne Idee haben sollte - raus damit...
viele Grüße Kai