C++ ifstream Daten einlesen in Variable

Aixx

Ensign
Registriert
Sep. 2011
Beiträge
239
Hi an alle,

ich bin gerade am rumprobieren mit C++ Funktionen usw. und habe mal versucht eine Datenbank zu erstellen.

Sie funktioniert soweit das ich die eingegebenen Kunden speichern kann in eine TXT Datei.

Diese möchte ich nun beim nächsten Programmstart wieder einlesen und in die gleichen Variablen speichern wie sie am anfang waren.

Da gibt es einmal die:

Kunden ID
Kunden Vorname
Kunden Nachname

Diese speichert er folgendermaßen in die TXT Datei:

1 // ID
Hans // Vorname
Wurst // Nachname
1Ende // Punkt an dem er aufhören soll einzulesen
2 // Entweder soll er hier wieder anfangen einzulesen oder ich würde noch ein 2Anfang generieren.
Peter //Vorname
Baum // Nachname
2Ende // Wieder das Ende


Nun bin ich auf der Suche wie er die Daten einliesst und bei den bestimmten Punkten aufhört einzulesen und ab einem bestimmten Punkt wieder anfängt.
Im Moment sieht es bei mir so aus

Code:
for(t=1;t<=50;t++)
{
ifstream in ("Daten.txt");
in >> Kundenfeld[t].nr >> Kundenfeld[t].KundeVorname >> Kundenfeld[t].KundeNachname,'[t]Ende';
}

das '[t]Ende' gibt ja so wie ich es erfahren habe an das er dort aufhört einzulesen. Stimmt dies ? Und wie lege ich fest ab wo er beim starten der nächsten Schleife wieder anfängt mit dem einlesen ?

Danke euch

Mfg
 
du musst das über eine struct machen:

struct anlegen:

Code:
struct KundenDaten
{
string vorname;
string nachname;
}


dann struct array anlegen:

Code:
KundenDaten Datensatz1[50];


ggf. struct leeren oder mit hex "00" bytes befüllen. (schreib ich hier jetzt mal nicht auf ... machst halt das string objekt leer indem du per memcpy die volle länge mit hex 00000 füllst)


dann struct mit kundendaten befüllen:

Code:
getline(cin,Datensatz1::vorname[0]);
getline(cin,Datensatz1::nachname[0]);
getline(cin,Datensatz1::vorname[1]);
getline(cin,Datensatz1::nachname[1]);


oder per datei:

Code:
ifstream input_file("datei.txt", ios::binary);
input_file.read((char*)&Datensatz1, sizeof(Datensatz1));  
input_file.close();

dann struct schreiben geht vom grunde her wie lesen nur ich würde es für die datensätze mit ios::app machen .... an deiner stelle würde ich (falls du c++ neuling bist) erstmal grundlagen leernen, sonst kommst du nicht wirklich weit.

oder versuch autoit ... das geht da alles wesentlich leichter und ohne umstände. ich persönlich schreibe nur dlls in c++ und binde sie dann in scriptsprachen ein.

Edit: kleine Korrektur ;)
 
Zuletzt bearbeitet:
Danke dir für die Hilfe. Heute keine Zeit mehr das umzusetzen aber bei Fragen melde ich mich am Wochenende. Danke dir
 
WhiteLionATX schrieb:
du musst das über eine struct machen:

struct anlegen:

Code:
struct KundenDaten
{
string vorname;
string nachname;
}


dann struct array anlegen:

Code:
KundenDaten Datensatz1[50];


ggf. struct leeren oder mit hex "00" bytes befüllen. (schreib ich hier jetzt mal nicht auf ... machst halt das string objekt leer indem du per memcpy die volle länge mit hex 00000 füllst)

NEIN!!!! Niemals eine Klasseninstanz mit memcpy glattbügeln, es sei denn du magst UNDEFINIERTES VERHALTEN. Außerdem ist ein frisch erzeugtes std::string Objekt sowieso leer.
 
also beim string objekt gebe ich dir recht, aber z.B beim char array ? was machst du denn da ?
mal angenommen du möchtest z.B. mit hex werte arbeiten also z.B. bytes vergleichen ...inklusive aller (also auch x\0) bytes ... wie stellst du das an ? - also ich plätte das array in voller länge durch memcpy und mach dann memcmp ....und du ? wann gibt es dabei undefinierbares verhalten (sofern man die länge berücksichtigt) ?

...okey du könntest jetzt sagen: wenn du die länge kennst, dann brauchst du es nicht ... das stimmt, aber wenn ich dann doch mal nur einen cstring habe, was spricht dagegen ?
 
Zuletzt bearbeitet:
Ich sprach von Klasseninstanzen, nicht von character-arrays. Google mal nach "C++ PODs". Alles was nicht in diese Kategorie fällt, solltest du auf KEINEN Fall mit memset() oder memcpy() beschreiben.
 
Zurück
Oben