Textdatei auslesen
-
Ich hab's nicht probiert, aber würde es nicht ausreichen, am Ende einfach
[...] while (cout << "Geben sie den Namen des neuen Members ein: ", getline(cin, gelesener_name)) { cout << gelesener_name << " war bisher " << vorhandene_namen.count(gelesener_name) << " Mal in der Datei vorhanden.\n"; vorhandene_namen.insert(gelesener_name); } namen_datei << vorhandene_namen << '\n'; }den ganzen Datensatz in die Datei zu schreiben anstatt bei jeder Eingabe darauf zuzugreifen?
-
Das ginge auch, aber ich weiß nicht was die genauen Anforderungen sind und so war es im Original. Und es würde die Reihenfolge verändern, wenn nicht zusätzliche Maßnahmen ergriffen werden.
Denk auch dran, dass das Schreiben in die Datei praktisch kostenlos ist, solange man sie nicht zwischendurch immer wieder schließt und öffnet.edit: Außerdem geht die Ausgabe eines Sets nicht einfach mit Operator <<.
-
Ersteinmal SeppJ vielen Dank für die Antwort.

Da ich leider wie gesagt noch ein absouluter Anfänger bin,
war es etwas schwer deine Lösung zu verstehen, habe keine
bis wenig Erfahrung mit den von dir verwendeten Befehlen.Was ich leider vergessen hatte zu erwähnen war, dass wenn
der Name in der Liste schon existiert, er NICHT nocheinmal
hineingeschrieben werden soll.Hast du dafür noch eine Idee?
-
Rick-K schrieb:
Was ich leider vergessen hatte zu erwähnen war, dass wenn
der Name in der Liste schon existiert, er NICHT nocheinmal
hineingeschrieben werden soll.Hast du dafür noch eine Idee?
Du prüft, ob die Anzahl 1 ist und reagierst dann entsprechend. Das ist eine einfache Kontrollstruktur, das solltest du mit deinen Kenntnissen hin bekommen.
Da ich leider wie gesagt noch ein absouluter Anfänger bin,
war es etwas schwer deine Lösung zu verstehen, habe keine
bis wenig Erfahrung mit den von dir verwendeten Befehlen.Werde konkreter: Was verstehst du nicht? Ich vermute mal (multi-)set und 30 und 31 verstehst du nicht. Liege ich da richtig? Aber den groben Programmfluss verstehst du?
-
Okey, ich versuche es mal.
Und ja, es war die Multiset Anweisung und 30-31, habe
mit "getline" usw. noch nichts zu tun gehabt.
-
Hmm, ok. Vielleicht solltest du noch ein bisschen in deinem Buch weiterlesen. Das mit der if-Abfrage bekommst du bestimmt selber hin, wenn du ein bisschen überlegst.
getline muss da bald kommen, das ist recht grundlegend wenn du irgendetwas zeilenweise einlesen möchtest wie eben deine Namen.
Set sollte auch in nicht zu ferner Zukunft drankommen, wenn dein Buch was taugt. Bis jetzt kannst du dir vorstellen, dass das einfach eine Ansammlung von Daten ist. Mit insert kann man etwas neues zur Sammlung zufügen, mit count kann man zählen wie oft ein bestimmter Datensatz vorkommt. Dadurch dass ich am Anfang multiset<string> gesagt habe, habe ich die Art der Daten auf strings fesgelegt. Das Set kann nämlich alle möglichen Arten von Daten (z.B. ints, floats, eigene Klassen) aufnehmen (aber immer nur eine Sorte auf einmal!). Der Unterschied zwischen Mutliset und Set ist, dass bei einem Multiset gleiche Einträge auch mehrmals vorkommen dürfen, bei einem set ist also count immer 0 oder 1.
Bei den Zeilen 30 und 31 habe ich den Kommaoperator benutzt. Der macht, dass alle Ausdrücke von links nach rechts ausgewertet werden, aber am Ende zählt nur der Ausdruck ganz rechts. also passiert zwar vorher das
cout << "Geben sie den Namen des neuen Members ein: ", aber das while sieht nurwhile (getline(cin, gelesener_name)). Und jetzt musst du natürlich noch wissen, was der Rückgabewert von getline ist, was wie gesagt bald kommen wird. Um vorweg zu greifen: Die ganzen Operationen die man auf den Streams macht (egal ob Eingabe oder Ausgabe) geben in der Regel hinterher wieder den Stream zurück. Also das getline das ich hier benutzt habe gibt wieder cin zurück. Du könntest also tatsächlich so etwas machen:cout << "Einen Namen angeben, Enter drücken und eine Zahl eingeben, dann Enter drücken: "; int zahl; string name; getline(cin, name) >> zahl;Wenn man nun so einen Stream in einem logischen Ausdruck auswertet (so wie hier in der Bedingung der while-Schleife), dann werden sie zu
true, wenn alles in Ordnung ist und zufalse, dann wenn aus ihnen nicht gelesen werden kann. Letzteres bedeutet, dass vorher irgendetwas schief gegangen ist. Das passiert zum Beispiel, wenn man ein Wort eingibt, aber eine Zahl erwartet wird. Beim zeilenweisen Lesen von Strings kann aber nichts schiefgehen, außer das ende wird erreicht. Die Zeilen 30-31 lesen also zeilenweise strings bis das Ende des Streams erreicht ist. Das ist was der Kommentar mit dem CTRL+Z aussagen will.
-
SeppJ schrieb:
...
Ganz großen Dank für deine Erklärung, ich habe es wirklich verstanden .

Mein Quelltext sieht jetzt folgendermaßen aus:
#include<fstream> #include<iostream> #include<string> #include<set> using namespace std; int main() { multiset<string> vorhandene_namen; { ifstream namen_datei("white-list.txt"); string gelesener_name; while (getline(namen_datei, gelesener_name)) vorhandene_namen.insert(gelesener_name); } start: ofstream namen_datei("white-list.txt", ios::app); string gelesener_name; while (cout << "Geben sie den Namen des neuen Members ein: ", getline(cin, gelesener_name)) { vorhandene_namen.count(gelesener_name); if(vorhandene_namen.count(gelesener_name) == 0) { cout << "User " << gelesener_name << " wurde hinzugefuegt."; cout << endl; vorhandene_namen.insert(gelesener_name); namen_datei << gelesener_name << '\n'; } else { cout << "Der Username existiert bereits."; cout << endl; goto start; } } return 0; }Ich denke soweit sollte es bis jetzt stimmen. Ich hoffe ich kann mich bei
(sicher folgenden) weiteren Fragen wieder melden.Lieben Dank für deine Hilfe.

Ps: Ja mit dem Buch bin ich noch nicht ganz durch, liegt daran dass ich
es nicht finde.
-
Pfui! goto Pfui!
-
314159265358979 schrieb:
Pfui! goto Pfui!
Auch noch ein goto welches gar nichts macht*. Ohne würde es perfekt funktionieren.
*: Außer den Konstruktor einiger Variablen erneut aufzurufen. Ehrlich gesagt habe ich keine Ahnung, was der Standard in diesem Fall vorsieht und ich will's auch nicht wirklich wissen.
-
314159265358979 schrieb:
Pfui! goto Pfui!
Ich freue mich über jeden Alternativ-Vorschlag

-
Rick-K schrieb:
Ich freue mich über jeden Alternativ-Vorschlag

Wozu ist es da? Lass es einfach weg und dein Programm mach immer noch das gleiche.
Und woher hast du die Idee? Wenn das aus deinem Buch ist, dann gehört das sicherlich nicht zu der Sorte die was taugt.
-
SeppJ schrieb:
Rick-K schrieb:
Ich freue mich über jeden Alternativ-Vorschlag

Wozu ist es da? Lass es einfach weg und dein Programm mach immer noch das gleiche.
Und woher hast du die Idee? Wenn das aus deinem Buch ist, dann gehört das sicherlich nicht zu der Sorte die was taugt.
Ich Probiere nur rum.
Und die Idee dazu, ich habe sie nicht aus meinem Buch.