ERLEDIGT
NEIN
NEIN
ANTWORTEN
23
23
ZUGRIFFE
1635
1635
EMPFEHLEN
-
Hi @ all !
Benutze den Borland C++ Builder 6...
Ich bin dabei ein Consolenprogramm zu schreiben das wie eine Bank aufgebaut sein soll...
Dazu will ich die verschiedenen Daten wie kontonummer, inhaber, pin, kontostand usw in eine binärdatei "konten.dat" abspeichern um sie später wieder auslesen zu können.
Ich denke das es mit fstream/iostream funktionieren müsste, habe aber keine ahnung wie ich das angehen soll.
Hoffe ihr könnt mir weiterhelfen.
greez
Weedy
Quelltext:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
#include <vcl.h> #pragma hdrstop #include <conio.h> #include <iostream.h> #pragma argsused //--------------------------------------------------------------------------- //Klassendefinition class standartk { double kontostand; int kontonummer; int bankleizahl; char* inhaber; int pin; public: //Konstruktoren standartk (double startwert, int ktn, int blz, char* name, int code) { kontostand=startwert; kontonummer=ktn; bankleizahl=blz; inhaber=name; pin=code; } standartk () { } //Destruktor ~standartk() { cout<<endl<<"Kontostand = "<<kontostand<<endl; } //Ausgabe Kontostand int aus() { return kontostand; } //Ausgabe Kontonummer int ktnummer() { return kontonummer; } //Ausgabe Kontoinhaber char* aktinhaber() { return inhaber; } //Ausgabe Pin int apin() { return pin; } //Ausgabe BLZ int blzahl() { return bankleizahl; } //Prozedur zum einzahlen int einzahlen (int ebetrag) { if (ebetrag<0) { ebetrag=0; cout<<"Keine negative Einzahlung möglich"<<endl; } else kontostand=kontostand+ebetrag; return kontostand; } //Prozedur zum abheben int auszahlen (int abetrag) { if (abetrag<0) { abetrag=0; cout<<"Keine negative Auszahlung möglich"<<endl; } else if ((kontostand-abetrag)<-1000) { abetrag=(kontostand+1000); cout<<"Nur 1000€ Dispo"<<endl; } kontostand=(kontostand-abetrag); return kontostand; } //Prozedur zum Pin ändern int paendern (int npin) { int npin1; int npin2; if (npin==pin) { cout<<endl<<"Bitte gewuenschten Pin eingeben: ";cin>>npin1; cout<<"Bitte gewuenschten Pin wiederholen: ";cin>>npin2;cout<<endl; if (npin1==npin2) { pin=npin1; } else cout<<endl<<"Pins stimmen nicht überein!"<<endl<<endl; } else cout<<endl<<"Pin-Code nicht korrekt"<<endl<<endl; return pin; } //Prozedur zum Namen ändern char* naendern (char* id) { inhaber=id; return inhaber; } }; //Anfangswerte für Konstruktor standartk S1(500, 130049638, 54051990, "Jens", 1234); //Hilfsvariablen int ez; int az; int p; char taste; char* n; //hauptprogramm int main(int argc, char* argv[]) { //Sprungmarke 1 loop1: //Hauptmenü do { cout<<endl; cout<<"###############################"<<endl; cout<<"# #"<<endl; cout<<"# Weedys Bank v1.3.6 #"<<endl; cout<<"# #"<<endl; cout<<"###############################"<<endl; cout<<"# #"<<endl; cout<<"# Kontostand anzeigen ----> K #"<<endl; cout<<"# Kontodaten anzeigen ----> D #"<<endl; cout<<"# Auf Konto Einzahlen ----> E #"<<endl; cout<<"# Von Konto Abheben ------> A #"<<endl; cout<<"# Kontodaten aendern -----> C #"<<endl; cout<<"# Beenden ----------------> B #"<<endl; cout<<"# #"<<endl; cout<<"###############################"<<endl<<endl; cout<<endl<<"Was moechten Sie? ";cin>>taste; switch (taste) { case 'k':case 'K': cout<<"Bitte geben Sie ihren Pin ein: ";cin>>p;clrscr();if (p==S1.apin()){cout<<endl<<"Ihr Kontostand belaeuft sich auf: "<<S1.aus()<<" eur"<<endl<<endl<<endl;} else {cout<<"Pin-Code nicht korrekt!"<<endl<<endl;}break; case 'd':case 'D': cout<<"Bitte geben Sie ihren Pin ein: ";cin>>p;clrscr();if (p==S1.apin()){cout<<endl<<"Kontonummer: "<<S1.ktnummer()<<endl<<"Bankleizahl: "<<S1.blzahl()<<endl<<"Kontoinhaber: "<<S1.aktinhaber()<<endl<<"Pin: "<<S1.apin()<<endl<<endl<<endl;} else {cout<<"Pin-Code nicht korrekt!"<<endl<<endl;} break; case 'e':case 'E': cout<<endl<<"Wieviel moechten Sie einzahlen? ";cin>>ez;ez=S1.einzahlen(ez);break; case 'a':case 'A': cout<<"Bitte geben Sie ihren Pin ein: ";cin>>p;cout<<endl;if (p==S1.apin()){cout<<endl<<"Wieviel moechten Sie abheben? ";cin>>az;clrscr();S1.auszahlen(az);} else {cout<<"Pin-Code nicht korrekt!"<<endl<<endl;}break; case 'c':case 'C': cout<<"Bitte geben Sie ihren Pin ein: ";cin>>p;cout<<endl;if (p==S1.apin()){clrscr();do { //Untermenü 1 cout<<endl; cout<<"###############################"<<endl; cout<<"# #"<<endl; cout<<"# Weedys Bank v1.3.6 #"<<endl; cout<<"# #"<<endl; cout<<"###############################"<<endl; cout<<"# Kontodaten aendern: #"<<endl; cout<<"###############################"<<endl; cout<<"# #"<<endl; cout<<"# Kontodaten anzeigen ----> D #"<<endl; cout<<"# Pin-Code aendern -------> P #"<<endl; cout<<"# Namen aendern ----------> N #"<<endl; cout<<"# Zurueck zum Hauptmenue--> Z #"<<endl; cout<<"# Beenden ----------------> B #"<<endl; cout<<"# #"<<endl; cout<<"###############################"<<endl<<endl; cout<<endl<<"Was moechten Sie? ";cin>>taste; switch (taste) { case 'd':case 'D': clrscr();cout<<endl<<"Kontonummer: "<<S1.ktnummer()<<endl<<"Bankleizahl: "<<S1.blzahl()<<endl<<"Kontoinhaber: "<<S1.aktinhaber()<<endl<<"Pin: "<<S1.apin()<<endl<<endl<<endl;break; case 'p':case 'P': clrscr();cout<<endl<<"Bitte aktuellen Pin eingeben: ";cin>>p;S1.paendern(p);break; case 'n':case 'N': clrscr();cout<<endl<<"Bitte neuen Namen eingeben: ";cin>>n;S1.naendern(n);break; case 'z':case 'Z': clrscr();goto loop1; } } //Abbruchbedingung Untermenü1 while (taste !='B' && taste !='b'); } else {cout<<"Pin-Code nicht korrekt!"<<endl<<endl;} } } //Abbruchbedingung Hauptmenü while (taste !='B' && taste !='b'); getch(); }Geändert von wedhead (06.03.07 um 19:30 Uhr)
-
Hallo,
in welcher Datenstruktur speicherst du eigentlich deine Konten?
hab in deinem Code nix darüber gefunden.. (hab ich's übersehn?)
Aber hier mal nen Codeschnipsel mit dem bestimmt was anfangen kannst:
Ist zwar nen Beispiel von mir aber kannst du bestimmt anpassen.
ich speicher nur nen Name und das alter...
zu speichern...Code :1
Person person("Jan", 23); // ist mein Objekt vom Typ Person
zu laden...Code :1 2 3 4 5 6
fstream f("test.dat", ios::out | ios::binary); if(f.good()) { f.write((char*)&person, sizeof(person)); } f.close();
Ich würde beides in eine extra Funktion packen und dann immer aufrufen wenns in die Datei soll.Code :1 2 3 4 5 6 7 8 9 10 11 12
Person person4; //variable anlegen fstream f4("test.dat", ios::binary | ios::in); if(f4.good()) { while(f4.eof() != true) // falls man mehrere Objekte in der Datei hat, würde sie bei dir gleich in einer STL Liste speichern { f4.read((char*)&person4, sizeof(person4)); // Objekt aus Datei der Variable zuweisen cout << person4.getName() << endl; // Objektinhalt ausgeben cout << person4.getInt() << endl; } } f4.close();
MfG Turri
-
boah das iss ma ne antwort, thx ich werd mal versuchen ob ichs hinbekomm
-
Š9|ÿ
*@ HŠ9 ˆ¥@ Œÿ so schaut die datei im hexeditor aus
-
binäre Dateien werden mit Zeichen gespeichert die teilweise nicht darstellbar sind.
klappts denn mit dem Laden aus der Datei?
MfG Turri
-
soweit bin ich noch nicht, dazu sind mir von gestern noch die daten verloren gegangen von meinem progg, ich hab mich jetzt nochma dran gemacht und werde gleich nochma mit der ein/ausgabe versuchen...
-
27.09.05 16:18 #7
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Warum wollt ihr denn das unbedingt als Binärdatei speichern?
Seid ihr euch im Klaren das das mit Zeigern in den Strukturen nicht klappen kann?! Die Werte der Zeiger in der Struktur werden zwar gespeichert, haben allerdings keinen vernünftigen Wert mehr nachdem das Programm neu gestartet und die Datei geladen wird.
Außerdem ist das Speichern von Daten in einer Binärdatei im einfachsten Falle nicht portabel. Du kannst keine Veränderungen an der Struktur vornehmen ohne das die Binärdatei ungültig wird. Hinzu kommt das bei unterschiedlichen Compilern und Compileroptionen die Strukturen unterschiedlichen Größen haben können - was dazu führt, das die Datei nicht lesbar ist.
Warum speichert ihr nicht einfach alles in einer Textdatei? Man kann sich ja einfach ein Format ausdenken was erweiterbar ist und hat noch den Vorteil, man kann es auch mit einem normalen Editor betrachten und editieren.
Z.B.In den eckigen Klammern steht meinetwegen der Klassenname, so das man auch weiß welche Klasse(Struktur) man nun erzeugen muß beim Einlesen. Danach folgen Schlüssel/Werte-Paare die nur noch in die entsprechenden Eigenschaften des Objektes einzutragen sind.Code :1 2 3 4 5 6 7 8 9
[Person] name = Schulz vorname = Klaus alter = 18 [Person] name = Müller vorname = Hans alter = 33
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Würde mir auf die art natürlich auch gefallen, wobei ich sagen muss so wie ich den Code Oben angepasst habe funktioniert es einwandfrei:
Bei deinem vorschlag trau ich mir nicht zu das ich das umsetzen kann, ich hab wenig ahnung von fstream und dem ganzen zeug musst du wissen.Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
void save(standartk *z) { fstream f("test.dat", ios::out); if(f.good()) { f.write((char*) z, sizeof(standartk)); } f.close(); cout<<"Schreibvorgang erfolgreich"<<endl; } void load(standartk *z) { fstream f("test.dat", ios::in); if(f.good()) { f.read((char*) z, sizeof(standartk)); } f.close(); cout<<"Lesevorgang erfolgreich"<<endl; }
greez
weedyGeändert von wedhead (27.09.05 um 16:51 Uhr)
-
Bei meinem Code hab ich auch mit statischen Objekten gearbeitet.
Sprich keine Zeiger.
MfG Turri
-
27.09.05 17:35 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Das wage ich zu bezweifeln. Hast du schonmal probiert deine Datei einzulesen und die entsprechenden Elemente deiner Klasse auszugeben nachdem du das Programm neu gestartet hast?!
Zitat von wedhead
Wenn du den Namen des Inhabers ausgeben willst wird dein Programm höchstwahrscheinlich abstürzen (oder zumindest irgend einen Müll ausgeben), denn der Name des Inhabers wurde gar nicht gespeichert - nur ein Verweis darauf. (es könnte höchstens funktionieren wenn der Name fest im Programm gespeichert ist, aber das ist ja nur ein Spezialfall)
Aber du weißt doch auch wie man mit cout etwas ausgibt. Das ist doch genau das gleiche. Nur das du den fstream vorher mit einer Datei verbindest.
Zitat von wedhead
Du mußt es ja nicht unbedingt so machen wie ich das vorgeschlagen habe. Es reicht ja auch erstmal so:Code :1 2 3 4 5 6 7 8 9 10
void save (fstream& datei, const standardk& z) { // damit man nachher weiß wo ein Konto anfängt: datei << "[standartk]" << endl; datei << z.inhaber << endl; datei << z.startwert << endl; datei << z.kontonummer << endl; datei << z.bankleitzahl << endl; datei << z.pin << endl << endl; }
Das Einlesen geht dann so:So sollte das eigentlich funktionieren. Du mußt nur dran denken den Speicher für den Inhaber wieder mitCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// ein StandardKonto von der Datei datei lesen: bool load (fstream& datei, standardk& z) { string str; while (getline (datei, str)) { if (str == "[standardk]") getline (datei, str); // für den Namen muß man Speicher // allozieren. Nachher wieder freigeben! z.inhaber = new char[str.length()+1] str.copy (z.inhaber, str.length ()); datei >> z.startwert; datei >> z.kontonummer; datei >> z.bankleitzahl; datei >> z.pin; return datei; } } }freizugeben. Da solltest du dir überlegen ob es nicht besser wäre statt char* einen std::string zu nehmen.Code :1
delete[] z.inhaber
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
27.09.05 17:44 #11
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Auch mit Objekten (wie z.B. einem std::string) wird das normal nicht funktionieren. Denn ein std::string verwaltet ja wiederum einen Pointer und der würde dann im schlimmsten Fall auf keine gültige Adresse oder auf zufällige Daten zeigen.
Zitat von Turri
Wie gesagt besteht außerdem noch das Problem, dass man es auf unterschiedlichen Systemen (big-endian/little-endian etc.) nicht mehr lesen kann. Ein Textdatei kann man überall wieder einlesen...If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Also bei mir hat mein kleines Progrämmchen funktioniert.
Auch mit Ausgabe des Namens usw.
Er wollte ja nur wissen wie man Daten binär speichert, in seinem Beispiel würde ich aber auch die reine Textspeicherung bevorzugen
MfG Turri
-
Zitat von deepthroat
Zum 1.: Also es funktioniert auch wenn ich pc ausmache und dann das proggg wieder starte.
Zum 2.: Das stürzt ab! Und ich hab kA was ich ändern muss, das das klappt...(denke das ich speicher reservieren muss, dann wirds gehen, bin aber nicht sicher)
EDIT: PS: Hätte es gern so wie in deinem Beispiel, also ca. so:
[Kunde1] //fortlaufende Zahl für mehrere konten zu speichern
120055533 // ktn
55055050 //blz
20000 //kontostand
Hans Wurst //inhaber
1111 //pinGeändert von wedhead (27.09.05 um 18:47 Uhr)
-
28.09.05 16:44 #14
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Naja, du müßtest halt den Namen des Inhabers erstmal speichern. Das hast du aber nicht getan. Also kannst du den Namen auch nicht wieder herstellen.
Zitat von wedhead
OK.
Zitat von wedhead

Das wäre ja schonmal die Funktion zum speichern. Benutzen kann man sie so:Code :1 2 3 4 5 6 7 8 9 10
void save (ostream& datei, int nr, const standardk& z) { // damit man nachher weiß wo ein Konto anfängt: datei << "[Konto" << nr << "]" << endl; datei << z.kontonummer << endl; datei << z.bankleitzahl << endl; datei << z.kontostand << endl; datei << z.inhaber << endl; datei << z.pin << endl << endl; }
Code :1 2 3 4 5 6
vector<standardk> konten; // enhält alle vorhandenen Konten ofstream datei ("konten.txt"); for (int i = 0; i < konten.size (); ++i) { save (datei, i+1, konten[i]); }
Jetzt zum Einlesen:Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// ein StandardKonto von der Datei datei lesen: // gibt "true" zurück wenn ein Konto eingelesen wurde // anderenfalls "false". bool load (istream& datei, standardk& z) { string str; const string such_str = "[Konto"; while (getline (datei, str)) { if (str.substr (0, such_str.length ()) == such_str) datei >> z.kontonummer; datei >> z.bankleitzahl; datei >> z.kontostand; getline (datei, z.inhaber); datei >> z.pin; return datei; } } return false; }
Um dann von der Datei alle Konten wieder zu lesen:
Code :1 2 3 4 5 6 7
vector<standardk> konten; ifstream datei ("konten.txt"); standardk z; while (load (datei, z)) { konten.push_back (z); }If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Also ich versteh nicht ganz wie ich das umsetzen soll, zb was bedeutet vextor <standartk>.... komm irgendwie nicht weiter, sorry aber ich bin echt nicht gerade gut in c++
Hier hab ich mal die CPP datei von meinem Projekt zum Download:
http://www.united-soldiers.info/cpp/unit1.cpp
Ähnliche Themen
-
Binärdatei in C
Von Domsi im Forum C/C++Antworten: 2Letzter Beitrag: 30.11.10, 14:50 -
Daten in DB schreiben
Von parafi im Forum PHPAntworten: 8Letzter Beitrag: 17.01.09, 17:06 -
Zeile beim schreiben von Binärdatei Abschliesen?
Von hanni6al im Forum C/C++Antworten: 4Letzter Beitrag: 09.12.08, 22:21 -
Daten in SQL-DB schreiben?
Von HM644 im Forum .NET DatenverwaltungAntworten: 1Letzter Beitrag: 08.11.07, 20:06 -
Daten in DB schreiben
Von Fröschle im Forum Relationale DatenbanksystemeAntworten: 4Letzter Beitrag: 18.01.04, 15:03





Zitieren
Login






