S
MS-Office-User schrieb:
Ich lese eine Datendatei mit verschiedenen Datensätzen mittels pragma pack und struct in C++ ein, ...
0 Berlin;111;111
1 Düsseldorf;111;2222
2 Wien;1111;1234
3 Dortmund;333;4444
4 ...
struct TStadt
{
char mName[64];
unsigned char mData1[4];
unsigned char mData2[4];
};
...
Als Erstes fällt mir auf, dass in Deinem Beispiel die Daten unterschiedliche Länge haben (Städtenamen) - berücksichtigt Deine Einleseroutine das?
Als Zweites, dass Du nicht die (praktischen, sicheren, ...) C++-Mittel verwendest:
string, ifstream, operator>>(), vector, map, ...
und schließlich, dass ich keine Fehlerbeschreibung in Deinem Text finde (du "scheiterst"?!?, Was meinst Du mit "Verknüpfung"?
Ich skizziere mal kurz, wie ich so ein Einlesen normalerweise löse:
#include <fstream>
using std::ifstream;
#include <string>
using std::string;
#include <vector>
using std::vector;
#include <iostream>
using std::cout;
struct Stadt
{
string name;
long data1, data2; // sind doch nur Zahlen, oder?
};
int main() {
ifstream in("MeineDatei.txt");
vector<Stadt> staedte;
while(in) {
Stadt stadt;
char trenner;
in >> stadt.name;
in >> trenner; // Semikolon überspringen
in >> stadt.data1;
in >> trenner; // Semikolon überspringen
in >> stadt.data2;
in >> trenner; // Semikolon überspringen
staedte.push_back(stadt);
}
// Ab hier kann ich auf die n. Stadt mittels staedte[n-1] zugreifen ...
// Hier z.B. einfach Ausgabe auf die Konsole
for(size_t i=0; i<staedte.size(); ++i)
cout << i << ". Stadt: name = " << staedte[i].name << ", data1 = " << staedte[i].data1 << ", data2 = " << staedte[i].data2 << "\n";
return 0;
};
Da kann man natürlich noch eine Menge verbessern (operator>>(Stadt&) , zeilenweise einlesen, Trennerhandling besser, operator<<() passend dazu, Fehlertoleranz (gerade bei großen Files wichtig), Ausgabe via iterator, ....), aber schon mit der einfachen Variante bekommst Du ein recht gute Fehlerbehandlung (z.B. String-Längen), einen Typkonvertierung, leichte Erweiterbarkeit, Übersichtlichkeit... geschenkt.
Kann es sein, dass Du ein "Datenmodell in C++" abzubilden versuchst? ("Index", "Verknüpfung", ... weisen für mich darauf hin) Dann solltest Du Dir unbedingt die StdLib-Container intensiv ansehen ("draufschaffen") und in 99,9% der Fälle auch verwenden!
Gruß,
Simon2.