|
||
Übung 2 |
||
Diese Übung war ein wenig schwierig zusammenzustellen, da das reine
Anwenden des Unterrichtsstoffes langweilig sein kann. Vielleicht ist das
Schreiben und Lesen einer Datei ein wenig Anreiz um zu experimentieren.
Ihr könnt Euch auch gerne eine andere Aufgabe selber stellen, Hauptsache
Ihr übt ! |
||
Hole die Lösung der CD-Liste vom letzten mal, oder verwende die Lösung, die ich Euch im Unterricht gezeigt habe. Versuche die CD-Klasse ein wenig zu erweitern, so dass Ihr vernünftige
Daten einfügen könnt, oder ergänzt das Programm so, dass
der Benutzer einigermassen bequem CD's einfügen kann. Diese Funktionen sollen nachher verwendet werden um die Daten in eine Datei zu speichern. Ergänze die Klasse CDListe ebenfalls um eine Schreiben-Funktion.
Diese Funktion beginnt bei der ersten CD ruft bei dieser die Schreiben-Funktion
auf (siehe nachher auch noch das Beispiel), und
holt sich danach die nächste CD und schreibt auch diese, usw. bis
alle CD's geschrieben wurden (siehe unten). Einige Tips zur Lösung sind unten noch grob skizziert. Vor allem gibt es beim Lesen der Daten aus einer Datei gewisse Details zu beachten. Falls Du noch nicht genug hast kannst Du noch versuchen den <<-operator so zu überschreiben, dass man Code wie diesen schreiben kann : |
||
Auch dazu gibt es weiter unten ein wenig Hilfe. |
||
|
||
Also hier ein wenig Hilfe. Als erstes die Lesen und Schreiben-Funktionen für die CD-Klasse: |
||
aus CD.H |
|
|
aus CD.CPP |
Beim Schreiben fügen wir nach dem Titel einen Tabulator-Zeichen ein ("\t"). Auf diese Art sind die ist der die Daten von einer CD sauber getrennt. Die Datei sind dann ungefähr so aus. |
|
test Fred Feuerstein 35.77 hallo Fred Feuerstein 35.88 |
||
Das hilft sehr beim Einlesen der Daten, was man in der Funktion CD::readFromStream
sieht. Die Funktion getline nimmt als ersten Parameter eine Referenz
auf einen istream. Das zweite ist der string, der die Daten erhält.
Das wichtigste ist der dritte Parameter '\t' ! Dieser sagt der getline-Funktion,
dass sie alles einlesen muss bis zum TAB-Zeichen. Normalerweise liest
die getline Funktion wie der Name schon sagt eine ganze Linie ein.
Mit dem dritten Parameter gibt man ihr aber an bei welchem Zeichen sie
aufhören soll. |
||
Jetzt noch ein kleines Beispiel zum Testen dieser Funktionen. Das komplette main.cpp, das auch gleich eine ganz kleine CD-Klasse zum Testen enthält kannst Du Dir auch downloaden. |
||
Wie im Kommentar bereits angegeben, muss die Datei, die mit fout geöffnet wurde, explizit mit der Funktion close der Klasse fstream wieder geschlossen werden, denn sonst könnte man weiter unten keinen ifstream machen, der aus dieser Datei liest. Beachte auch, dass der Datei Name oben als const char* defniert wurde. So dass besteht nicht die Gefahr beim mehrmaliger Eingabe des Dateinamens einen Fehler zu machen. Auch muss man dann nur an einem Ort den Dateinamen ändern. Euer Programm könnte sogar den Benutzer um die Eingabe eines Dateinamens bitten. |
||
|
||
Dieser Code ist nicht getestet ! Also überlegt Euch gut, ob Ihr ihn so übernehmen könnt. |
||
Mit der Funktion eof() der Klasse istream wird überprüft ob das Dateiende erreicht wurde. Es wird in der Schleife eine CD erstellt. Diese neue CD liest danach selbst die Daten aus dem istream. Zuletzt wird diese neue CD in die Liste eingefügt. |
||
Was jetzt noch folgt ist nur für die Interessierten ! Es macht nichts wenn Du es nicht verstehst (wobei Du das natürlich könntest !) Im Grunde genommen können wir jetzt unsere CDListe in einen Stream schreiben indem wir schreiben : |
||
Um Code wie diesen zu schreiben benötigen wir aber mehr: |
||
Dieser Code kompiliert noch nicht. Wir müssen noch den operator<< definieren : |
||
|
Beachte, dass der operator<< nicht zu einer Klasse gehört ! |