# Daten speichern und wieder auslesen



## Bennily (11. März 2004)

Kann mir mal einer Tips geben wie ich am besten Daten in eine .dat Datei speichere und dann später wieder aufrufe und vorallem ausfiltere und in Arrays/Variablen lade.

Also Beispiel ich will Namen und Adressen von 2 Menschen in einer Datei speichern und später bei einem erneuten Programmstart auch wieder afurufen, ausfiltern, und in Variablen oder Arrays bekommen.

Was für Techniken setzt ihr für sowas ein?


----------



## Kachelator (11. März 2004)

Ich setze iostreams ein.  Was ist eine .dat-Datei?


----------



## Bennily (11. März 2004)

Was ist ein Iostream?


----------



## Kachelator (11. März 2004)

Das sind Klassen, die bei C++ die Ein- und  Ausgabe von und auf beispielsweise Dateien steuern.  In C verwendet man stattdessen Filefunktionen wie fopen(), fprintf() usw.

Folgender Schnipsel würde zum Beispiel meinen Nickname in eine Datei schreiben:


```
#include <fstream>
int main()
{
  using namespace std;
  
  ofstream of( "meine_datei.txt" ); // ofstream = Datei-Ausgabe-Strom
  of << "Kachelator";
  
  return 0;
}
```


----------



## Carndret (11. März 2004)

iostream ist nur eine Klasse siehe MSDN Library . Und mit deiner .dat Datei meintest du wahrscheinlich einfach nur irgendeine Datei in der deine Daten gespeichert werden. Ob die nun .dat heißt oder .bmp oder .lol ist egal haupsache du liest die Daten so aus wie du sie reingeschrieben hast. Wie die Endung heißt ist dir überlassen.

Edit: mmh eine Minute zu spät


----------



## Bennily (11. März 2004)

Ich glaube ich hab mich nicht ganz richtig ausgedrückt.
Ich weis wie cih Dateien Öffne/Schließe und in Dateien schreibe/auslese.,

Aber was bringt mir ein string in dem ich z.B die Adressen von 10 Leuten habe (Das Programm weis nciht wie viele es sind) wenn ich das nicht irgendwie trenen und in Variablen/Arrays bekommen kann?


----------



## Kachelator (11. März 2004)

Dann musst du die Daten in der Datei irgendwie trennen, zum Beispiel mit Kommas.


----------



## Bennily (11. März 2004)

Auf die Idee bin cih auch schon gekommen.
Also in PHP würde ich mit ner Kombination von Trennzeichen arbeiten und dann mit explode() rangehen.
Nur gibts das auch in C/C++?
Und wie genau arbeitet es da?


----------



## Kachelator (11. März 2004)

> Nur gibts das auch in C/C++?


 Nein, es sei denn, dass es eine Library gibt, die das ermöglicht.

Grundsätzlich hast du ja (vereinfacht gesagt) drei Möglichkeiten, Objekte zu serialisieren:
1. Binär
Du klatscht den ganzen Speicher, den dein Objekt im Speicher einnimmt, in eine Binärdatei rein. Mehrer Objekte können getrennt werden, weil jedes Objekt gleichgross ist.
2. Klartext
sowas wie: 
*
[Kunde 0]
name=Kachelator
telefon=0123456789
[Kunde 1]
name= Bennily
telefon=333333
usw.
*
3. Datenbankzugriff mit SQL


----------



## Bennily (11. März 2004)

Könntest du mir mal nen konkretes Beispiel für die 2te Version geben?


----------



## Kachelator (11. März 2004)

Versuch einfach mal, deine Daten in dieser Form in eine Textdatei zu speichern. Das ist recht einfach. Wenn du das hast, kommt der spannende Teil: Du liest die Datei ein und untersuchst sie zeichenweise, ob von dir verwendete Schlüsselworte auftauchen. In meinem Beispiel wären das "[", "Kunde", "name" und so weiter. Wenn dann eines dieser Worte auftaucht, muss dein Programm entsprechen reagieren: Bei "Kunde" ein neues Kundenobjekt erzeugen, bei "telefon" dem zuletzt erzeugten Kundenobjekt die folgende Telefonnummer zuweisen und so fort. 
Die von mir im Beispiel verwendete Syntax ist natürlich nur eine Beispielsyntax. 
Ich habe übrigens gute Erfahrung mit LUA für diesen Einsatzzweck gemacht, aber das geht wohl über das Thema hinaus.


----------



## Bennily (11. März 2004)

Vielen Dank, ich glaube so kann ich das schaffen was ich will.

Aber noch eine Frage: Brauche ich die Umbrüche dafür?


----------



## Kachelator (11. März 2004)

In meinem Beispiel oben nicht unbedingt, es macht das Ganze auf jeden Fall lesbarer, was man berückisichtigen sollte, da es eine grosse Hilfe beim Debuggen ist. Ich habe in einem grösseren Projekt (Das lief über etwas mehr als zwei Jahre) von vorneherein festgelegt, dass alle Projektdateien in einer ähnlichen gescripteten Form angelegt werden und habe es nicht bereut. Es hat unglaublich viel Zeit beim Debugging und Testing gespart. Erst die endgültigen Daten lagen dann aus Performancegründen in einer eher binären Form auf der Platte.


----------

