006
30.12.2015, 17:08 Uhr
Hans
Library Walker (Operator)
|
Hi,
@ao:
Zitat von ao: |
getline (istream &, string & ) tut das hier: Zeichen aus dem Stream lesen und in dem string ablegen, und zwar bis zum nächsten Zeilenende, wobei das Zeilenende selber weggeworfen und nicht in den String gelegt wird. Siehe hier: www.cplusplus.com/reference/string/string/getline/
|
Das hab ich auch schon heraus gefunden, da ich die Seite auch kenne. Und weil es in diesem Stream anscheinend kein Zeilenende-Kennzeichen gibt, bzw. dieses durch die in>>-Aufrufe schon verarbeitet wurde, hab ich ja geschrieben, das man es auch weglassen kann.
Zitat von ao: |
Indem man mit dem String nichts weiter anfängt, drückt man hier aus, dass man alle benötigten Daten hat und dass der Rest der Zeile (falls es einen gibt) nicht interessiert.
In diesem konkreten Fall ist Rest leer, weil die in>>-Aufrufe schon alles ausgelesen haben. Das getline wird also nur aufgerufen wegen der "Nebenwirkung", das Zeilenende aus dem Stream zu entfernen, damit beim nächsten Schleifendurchlauf ein frischer Datensatz zur Verfügung steht.
Das muss aber nicht der Fall sein, die nächste Version der schueler.txt kann nach dem Prüfungs-Flag noch weitere Daten enthalten, die dann ignoriert werden. Es ist also gar nicht so doof, mit einem getline in eindeutiger und erweiterbarer Weise den nächsten Datensatz klarzumachen. Ein Kommentar könnte jedoch nicht schaden.
|
Da könnte ein Kommentar wirklich nicht schaden, denn da bin ich auch noch nicht drauf gekommen. Und ich glaube, diese Überlegung geht auch über Anfängerniveau hinaus.
Zitat von ao: |
Problematisch an dem Code ist, dass die String-Variable ebenfalls "daten" heißt und damit die globale Variable struct schueler daten verdeckt. Auch das ist erst mal kein Fehler, kann aber den Programmierer verwirren, und gibt spätestens dann Probleme, wenn man zwischen dem getline und dem Ende der Schleife nochmal an die struct-Daten heranwill. Die sind da nämlich nicht erreichbar.
|
Das ist mir inzwischen auch aufgefallen. Das ist wohl ein Grund dafür, warum man Strukturen gerne so definiert:
C++: |
struct SCHUELER { int nummer; string vorname; string nachname; bool pruef; }schueler_daten; // oder einfach nur "schueler" in Kleinbuchstaben
|
Dann hat die Struct-Variable einen eindeutigen Namen, der nicht so schnell zu Verwirrung führen kann.
Zitat von ao: |
Ich mag dieses fummelige Kleinklein auf Dateien nicht, ich habe lieber einen kompletten Datensatz im Speicher und nehme ihn da auseinander.
|
Das hätte ich in C wahrscheinlich auch so gemacht, indem ich mit fread() einen kompletten Datensatz, bzw. eine komplette Zeile gelesen hätte, diese anschliessend zerlegt und die einzelnen Teile den Strukturelementen zugeweisen. Aber ich stelle gerade fest, dass das etwas mehr gefummel wäre, als in C++...
Bearbeitung: |
Ich hab das jetzt mal in C gemacht und es war noch mehr gefummel als ich erwartet hatte. Hab aber fgets() anstelle von fread() genommen, weil ja Textzeilen verarbeitet werden und keine binären Daten vorkommen. Den entsprechenden Code erspare ich uns hier, - falls Interesse besteht, poste ich den vielleicht in einem anderen Thread, weil er hier OffTopic wird. (und ausserdem eine Lösung verrät, die die Fragestellerin sich erstmal selbst erarbeiten soll.)
|
Aber es stimmt natürlich, letzten Endes ist es Geschmacksache, wie man die Verarbeitung der Datensätze löst.
Hans
P.S.
Zitat von ao: |
Damit das so kompiliert, muss #include <sstream> vorangestellt werden., string
|
Oh, was wurde denn hier verschluckt? -- Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung. Dieser Post wurde am 30.12.2015 um 22:37 Uhr von Hans editiert. |