File einbinden
-
Ein kleiner Auszug aus dem Textfile
char order_id[24] "8BAC0124.000-1"
char rev_id[4] ""
...
ulong rev_nr 0
...Aus diesen Angaben lese ich wie ich die Daten aus dem Binärfile handhaben muss.
In diesem Fall eben die ersten 24 Byte ein String, dann wieder 4 Byte ein String. Dies mit verschiedenen Datentypen. (Die Wertangaben werden hierbei völlig ignoriert)
Die Angaben aus dem Binärfile werden dann in ein neues Textfile gespeichert.Allerdings muss zu jedem Binärfile auch immer ein Textfile übergeben werden.
Das Programm soll nun so gestaltet werden, dass einige dieser fertigen Textfiles in das Programm implementiert werden.
D.h Ich übergebe dem Programm nur das Binärfile, es durchsucht die implementieren Textfiles ob das zu dem Binäfile passende dabei ist.
(Durch die order_id von oben, bzw. den Namen des Textfiles möglich)
Falls ja wird es danach bearbeitet, falls nein wird nach einem externen File
verlangt.Mein Problem besteht nun darin das ich keine Ahnung habe wie ich die Textfiles implementieren kann,
ohne das durch späteres hinzufügen neuer Files großartige Codeveränderungen vorgenommen werden müssen.mfg
-
Da anhand einer simplen Binärdatei nicht sinnvoll festgestellt werden kann, was drinsteht (bei Strings kann evtl. nach erlaubten Zeichen gesucht werden etc.), bleibt hier doch eh nur der Weg über die Größe der Datei.
-
Vl. noch zu erwähnen währe das die Binärfiles vin einem Eprom geladen werden
in dem File sind gewisse Grundeinstellungen gespeichert.
Die ersten 24 Byte der Binärdatein sind immer die order_id.
Der Filename des Textfiles besteht aus der order_id und einer Versionsnummer.An der größe kann nicht erkannt werden um welches Binärfile es sich handelt
da alle entweder 512 oder 528 Byte haben.Ich könnte natürlich das ganze mittels switch/case machen allerdings würde
dies bei einem neuem Modul(neues Binärfile u. Textfile zum interpretieren)
eine erneute Bearbeitung des Codes bedeuten.
-
Also wenn wir davon ausgehen das bei den char-Teilen nur bestimmte Zeichen erlaubt sind (a-zA-Z0-9.,- etc.), dann könntest du leicht die Textdateien alle einlesen und diese parallel durchgehen.
In etwa so (nur so hingeschrieben, kein korrektes C++):
typedef vector<string> file; struct scanpos{ int txt_pos; char *bin_pos; }; vector< file > files; vector< scanpos > scan; char *bin_file; // ... einlesen ... // für jede txt-datei // ... für jede zeile in txt zeile // ... ... typ auslesen, länge des binären parts auslesen // ... ... mit bin vergleichen, im erlaubten rahmen? // ... ... wenn nicht, nächste testen // ... ... sonst zeiger vorrücken (txt_pos++, bin_pos += length)
-
hm ich glaube wir reden aneinander vorbei.
Irgendwie spinnt RS gerade bei mir sonst hätte ich mal ein Beispiel file geuppt.Ich werd mal schaun das ich das hinbekomm dann geht das ganze leichter zu beschreiben.
-
Ah, okay.
Du lädst also eine Binärdatei und anhand der ersten beiden Informationen wird bestimmt wie der Rest aussieht (was hier egal ist). Dies steht in diversen Textdateien, die man an sich dann angeben muss, wenn man eine Binärdatei angibt.
Nun hast du aber sagen wir mal die Standard-Beschreibungsdateien schon und willst diese automatisch durchgehen lassen, damit du nicht jedesmal eine Textdatei angeben musst.
In dem Fall wäre es wohl am einfachsten diese als stumpfe Textdatei in einem extra Ordner liegen zu haben. Diese werden bei jeden Laden einer Binärdatei nacheinander durchgegangen und die richtige rausgesucht...
Ist zB 8BAC0124.000-1 das was dann in der Binärdatei an der Stelle der order_id steht? Wenn ja, dann reicht es ja aus der Binärdatei die beiden wichtigen Werte auszulesen und dann von den Textdateien die ersten beiden Zeilen einzulesen und mit dem Wert, umgeben von "" per find zu vergleichen.
-
[url]http://rapidshare.com/files/138234465/Daten.zip[url]
Ja genau so sollte es glaub ich sein^^
Mein problem dabei ist wie ich mittels der order_id z.B
8BAC0124.000-1 die Textdatei mit dem vollen Namen:8BAC0122.000-1_V0.2.txt
öffnen kann.
Die Versionsnummer des Textfiles und somit der Name kann sich leicht ändern und sollte deshalb nicht im Code sein.
-
Hi
Du könntest alle Dateien in dem Ordner in eine Liste einspeichern und dann nur die ersten X Zeichen vergleichen.
-
Vielen Dank habt mir schon sehr geholfen
Hab jetzt noch eine kleine Frage.
Ich bekomme einen String.
In diesem String steht welches Array verwendet werden muss.z.B: im String steht xyz
Das Array xyz wird verwendetist dies auch irgend wie ohne switch/case abfragen möglich?
mfg
-
Wenn die Möglichkeiten feststehen, kannst du dies über eine map regeln. Key wäre der String und der Wert ein Pointer auf das jeweilige Array.
-
hört sich gut an
Kannst mir nen link oder so geben wo das mit der map erklärt wird.
Hab noch nie was davon gehörht^^danke
-
http://www.cppreference.com/cppmap/index.html
Läßt sich im Grunde wie jeder andere Container auch verwenden.
edit: zB:
#include <map> #include <string> // ... std::map< std::string, int* > myMap; myMap["abc"] = array1; myMap["bcd"] = array2; // ... if (myMap[eingelesenerString]){ int* jetzigerArray = myMap[eingelesenerString]; }
-
Ist es möglich alle Files aus einem Ordner zu includen? ohne die einzelnen Filename zu wissen.
Ich habe in einem Includefile eine char array dessen Name mir nur durch den Inhalt eines Strings bekannt ist,
kann ich irgend wie auf das array zugreifen?Man hat in einem Ordner verschiedene Textfiles z.B:
test001_V1.3
test002_V0.3
...In meine Programm erhalte ich einen String test001.
Ist es irgend wie möglich ohne den vollen Filenamen zu wissen es zu öffnen?
bzw. eine Art Wildecard suche durchzuführen?MFG und Vielen Dank
Reinhard