Daten in Binärdatei schreiben...

Turri hat gesagt.:
Bei meinem Code hab ich auch mit statischen Objekten gearbeitet.
Sprich keine Zeiger. :)

MfG Turri
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.

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...
 
:eek: 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
 
deepthroat hat gesagt.:
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?!

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)


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 //pin
 
Zuletzt bearbeitet:
wedhead hat gesagt.:
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)
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.
wedhead hat gesagt.:
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 //pin
OK. ;)
Code:
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;
}
Das wäre ja schonmal die Funktion zum speichern. Benutzen kann man sie so:
Code:
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:
// 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:
vector<standardk> konten;
ifstream datei ("konten.txt");
standardk z;

while (load (datei, z)) {
  konten.push_back (z);
}
 
Das mit dem vector war ja nur ein Beispiel. Ich weiß ja nicht womit du deine standardk Objekte verwalten willst (wenn du halt mehrere Konten hast).

Im Grunde ist ein vector ein "dynamisches Array" und fast genauso zu benutzen wie ein normales Array auch.

Der Typ der Objekte die der Vektor verwalten soll ist zwischen den < > Zeichen anzugeben.

Code:
#include <vector>   // notwendig für Verwendung v. vector

using namespace std;

int main () {
  // ein Array mit 10 Elementen vom Typ int mit
  // Index von 0 bis 9
  int array[10];
  
  // ein Vector mit 10 Elementen vom Typ int mit
  // Index von 0 bis 9
  vector<int> vec (10);
 
  array[0] = 3;
  vec[0] = 3;

  vec[1] += vec[0];
  vec[2] += vec[1] * array[0];
}

Wie gesagt, du kannst genauso gut auch einfach erstmal ein Array nehmen. (nur bist du da eben immer auf eine bestimmte Anzahl von Konten beschränkt und der Vektor passt sich automatisch an).
 
bei der zeile: void test (ostream& datei, int nr, const standardk& z) {

kommt folgende fehlermeldung: [C++ Error] Unit1.cpp(183): E2293 ) expected


ok das prob hab ich gecheckt, naja das nächste iss schon am start^^
 
Zuletzt bearbeitet:
ach ich check die ganze e net, ich bekomms einfach net hin, das in mein quelltext einzufügen, bis das klappt werd ich 4wochen brauchen bis ich alle fehler gecheckt hab die ich mach^^

*schäm*
 
Tja, jeder fängt mal klein an. Am besten wäre ja du besorgst dir ein gutes Buch über C++ (z.B. "C++ - Die Programmiersprache" von Bjarne Stroustrup). Kannste dir ja auch ausleihen in der nächstgelegenen Bibliothek. Aber ein solches Buch zum Nachschlagen zu besitzen kann eigentlich nicht verkehrt sein.

Was hast du denn eigentlich für eine Datei gepostet? Das ist ja ganz was anderes; irgendeine Klasse "speicher"? :confused:

Poste doch mal was du bisher gemacht hast, dann schau ich's mir mal an.
 
Zurück