The Incredible Fufialk Geschrieben 23. März 2005 Geschrieben 23. März 2005 Ich bekomme ein Messdatenfile als Hexstream und will diesen wieder in eine lesbare Tabelle umwandeln. Die einzelnen Daten sind dabei folgendermaßen aufgelistet: 1.Wert [blocknummer (integer),Datenlänge (integer), Zeitstempel (long integer), Messwert (integer)] und dann kommt der nächste Wert. Der Stream sieht dann ungefähr so aus: [0200 2000 F511DF41 64000000~0083] [0200 2000 F511DF41 64000000~0083] Derzeit lese ich noch alles in ein Array ein, was aber quatsch ist, da ich ja verschiedene Typen habe. Vielleicht kann mir ja jemand einen Tipp geben, wie ich vorgehen kann. Hänge mal meinen Quelltext an, damit Ihr wisst, wie weit ich bin. Code: #include <iostream.h> // cin, cout #include <fstream.h> // ifstream, ofstream #include <stdlib.h> // exit, rand #include <iomanip.h> // setw #include <conio.h> // getch void main() { ofstream ofl; // Ausgabestrom char fileread[64]; // Dateiname der einzulesenden Datei char filewrite[64]; // Dateiname der Auszugebenden Datei double c; // Eingabezeichen char rep; // Kontrollvariable int i; // Zähler Zeile int y[1000]; // Array zum einlesen der Daten begin: // Label cout << "\n\n Geben Sie den Dateinamen der zu bearbeitenden Datei ein: "; cin.getline(fileread, 64); ifstream ifl(fileread, ios::in|ios::binary); //öffnen der Datei zur Eingabe im Binärmodus if (!ifl) // Fehler beim öffnen der Datei { cerr << "\nFehler beim oeffnen der Datei! " << fileread; cout << "\n\nWollen Sie es noch einmal versuchen? (j/n)"; rep = cin.get(); while (cin.get() !='\n'); // Tastaturpuffer leeren für Schleife bei falscher Eingabe if (rep == 'n') { exit (1); } else { goto begin; } } ifl.read((char*)y, sizeof(y)); // Dateiinhalt in Array y einlesen ifl.close(); weiter: cout << "\n\nUnter welchem Namen soll die datei gespeichert werden?: "; cin.getline(filewrite, 64); ifstream cfl(filewrite); // Datei für Ausgabe öffnen if (!cfl) goto open; else { // Fehler beim öffnen cout << "\nFehler! Die Datei " << filewrite << " ist bereits vorhanden!"; cout << "\n\nGeben Sie einen anderen Dateinamen ein!"; goto weiter; } open: ofl.open(filewrite); for (i = 0; i < 10000; i++) // gelesene Werte in Array schreiben { ofl.precision(8); // Zahlen auf 8 Stellen begrenzen ofl << setfill(' ') << setw(18) << dec << y; // gelesene Werte anzeigen if(!((i+1)%18)) // 18 Werte pro Zeile ofl << endl; } ofl.close(); cout << "\nKonvertierung abgeschschlossen.\nDie Datei " << fileread << "\nwurde unter dem Namen " << filewrite << " abgespeichert."; cout << "\n\n\Zum Beenden druecken Sie eine beliebige Taste."; getch(); } Zitieren
kLeiner_HobBes Geschrieben 23. März 2005 Geschrieben 23. März 2005 Baue eine Klasse oder Struktur, welche die vier o.g. Eigenschaften enthält. Dann noch eine statische Methode dazu, die einen String, der einen Datensatz enthält, parst und ein Objekt deiner Struktur zurückgibt. Dann kannst du ja noch ein paar Funktionen bauen, welche dir ein Array vom Typ deiner Struktur aus einer Input-Datei ausliest, eine, die dieses Array in eine Tabelle speichert (CSV bietet sich da an) etc. Gruß Zitieren
U-- °LoneWolf° Geschrieben 23. März 2005 Geschrieben 23. März 2005 Hi, ich hätte da eine kurze Verständnis Frage 1.Wert [blocknummer (integer),Datenlänge (integer), Zeitstempel (long integer), Messwert (integer)] [0200 2000 F511DF41 64000000~0083] Das heißt also [] Trennt die Blöcke 0200 ist die Blocknummer 2000 ist die Länge F511DF41 ist der Zeitstempel 64000000~0083 ist der Messewert aber wozu dient dieser wert "~0083"? Gehört das zum messwert? Den ~ ist kein Hexzeichen Zitieren
The Incredible Fufialk Geschrieben 23. März 2005 Autor Geschrieben 23. März 2005 Hi, ich hätte da eine kurze Verständnis Frage Das heißt also [] Trennt die Blöcke 0200 ist die Blocknummer 2000 ist die Länge F511DF41 ist der Zeitstempel 64000000~0083 ist der Messewert aber wozu dient dieser wert "~0083"? Gehört das zum messwert? Den ~ ist kein Hexzeichen Habe die Klammern nur gesetzt, um die Blöcke zur besseren verständnis zu trennen. Der Messwert selbst kann bis zu 32 Worte lang sein habe das ~ nur als Platzhalter eingefügt. Im File stehen dort natürlich echte Werte. Zitieren
The Incredible Fufialk Geschrieben 23. März 2005 Autor Geschrieben 23. März 2005 Habe mich oben etwas ungünstig ausgedrückt. Die Reihenfolge der Daten ist folgendermaßen: Blocknummer (int), Anzahl der Messwerte (int), Zeitstempel (long int), Messwerte (int) mit maximal 32 Werten je Block. Zitieren
Mephisto81 Geschrieben 23. März 2005 Geschrieben 23. März 2005 *schock* ein goto in c++-code :beagolisc Zitieren
The Incredible Fufialk Geschrieben 29. März 2005 Autor Geschrieben 29. März 2005 Also die Struktur ist nicht das Problem, würde für meinen Fall so aussehen: struct { int block1; int length1; long int zeit1; int werte1[32]; int block2; int length2; long int zeit2; int werte2[24]; } Messwert; Auf Grund mangelnder Kenntnisse weiß ich aber nicht, wie ich die Daten korrekt aufgeteilt bekomme. Die Literatur die ich benutze beschreibt nur, wie die Structuren sofort deklariere bzw. wie ich über Tastatureingaben weitere werte zuweisen kann. Habt Ihr da vielleicht noch einen Tipp, wo ich das mal nachlesen könnte? Vielen Dank. Zitieren
Crush Geschrieben 29. März 2005 Geschrieben 29. März 2005 Naja, goto gehört ja an sich offiziell zur Syntax =8-) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.