Ignorieren von bestimmen Strings beim einlesen einer Textdatei
-
Danke erstmal für die schnelle Antwort, allerdings markiert er mir nun die push_back Funktion und leider helfen mir diese Fehlermeldungen so so gut wie nie....
Kann mir der Fehler eventuell erklärt werden?
Über C++ ist leider so gut wie nichts für Anfänger verständliches zu finden......Hier der Code:
vector<textdatei> Daten(string filename)
{
vector<textdatei> Ergebnis;string zeile; // Zeichenketten (strings) deklarieren: "zeile" und "text" textdatei text; ifstream Eingabe(filename); // Einlesestrom öffnen, Textdatei "Auswahl_WPM.txt" einlesen if (!Eingabe) { printf("Die Datei konnte nicht gefunden werden oder wurder falsch geschrieben!"); //Wenn die Datei nicht gefunden werden konnte, wird diese Meldung ausgegeben system("pause"); } //Falls Datei gefunden wird hier fortgesetzt while (getline(Eingabe, zeile)) // while-Schleife definieren, Schleifen-Bedingung: Ausführung solange Zeichenkette eingelesen wird //(mit Einlesestrom "input" und Zeichenkette "zeile") { if ((zeile != "Nicht abgestimmt") || (zeile != "Nicht abgestimmt")) { Ergebnis.**push_back**(zeile); } Ergebnis.push_back(text); } Eingabe.close(); return Ergebnis;
}
Grüße.
-
Was soll denn
textdatei
für ein Datentyp sein?
Warum benutzt du nichtstring
?PS: Schau dir mal die Linkliste an, um einen guten Einstieg in C++ zu erhalten.
-
Wenn ich das richtig sehe, hast du einen
vector<textdatei>
und versucht da seinenstring
rein zu schieben. Das geh nicht, du brauchst einenvector<string>
um die Strings da rein zu schreiben.
-
Entschuldigt die Verwirrung, aber ich habe über dem vector "textatei" in einem struct als String definiert, welcher aus mehreren Strings besteht.
struct textdatei
{
string Student;
string Modul;
};Grüße.
Ps: die doppelten Sternchen an dem push_back sollten nicht sein.
-
Aber es bleibt dabei: Du kannst einen
string
nicht in einenvector<textdatei>
schieben,string
undtextdatei
sind unterschiedliche Typen.
-
Neben dem, was die anderen schon zu deinem vector gesagt haben:
@SaturnsHyperion sagte in Ignorieren von bestimmen Strings beim einlesen einer Textdatei:
if ((zeile != "Nicht abgestimmt") || (zeile != "Nicht abgestimmt"))
Was soll das denn? Du vergleich 2x mit demselben String? Falls du hier unterschiedliche Strings meinen solltest, dann wäre die Bedingung immer
true
. Überdenke also nochmal deine Logik. Ich nehme an, dass du eigentlich&&
statt||
verwenden wolltest.Und wozu noch das
Ergebnis.push_back(text);
- was soll das überhaupt tun?
-
Wenn deine Zeile aus 2 Wörtern besteht, so müßtest du diese erst ermitteln, bevor du den Vector damit füllst.
Gibt es ein spezielles Trennzeichen oder dürfen wederStudent
nochModul
ein Leerzeichen (Space) enthalten?
-
Ja, stimmt, ich wollte nicht zweimal nach dem gleiche prüfen. Der zweite Ausdruck sollte "abgestimmt" enthalten, sodass diese beiden Zeilen, falls erkannt, ausgelassen werden.
Ich hatte die erste Antwort von @Th69 so verstanden, dass dies angepasst an meinen Code wäre und so funktionieren könnte, da bei Ihm ja nur allgemein mit "vec.", "str" bezeichnet.Wie gesagt, ich kann leider überhaupt nicht mit dem Thema und hätte gern eine andere (leichtere) Sprache gelernt.
Grüße.
-
@Th69 Es handelt sich um ca. 450 Zeilen, welche abwechselnd mit den zu ignorierenden Begriffen oder mit einem Modul und einem Studenten gefüllt sind. Das Modul und den Studenten versuche ich dadurch zu extrahieren, indem ich nach dem ersten Char und dem trennenden Leerzeichen suche und somit über die Funktion substr diese trenne. Anschließend tausche ich das Leerzeichen gegen ein Semikolon. So kann ich dann jedenfalls gedacht, diese dann getrennt voneinander in SQLite in Tabellen einfügen.
Grüße.
-
Du meinst die Textdatei sieht in etwa so aus:
Abgestimmt Student1 Modul1 Nicht abgestimmt Student2 Modul2 Abgestimmt Student3 Modul3 ...
?
Und du möchtest jeweils nur die Zeile unter "Abgestimmt" in den Vector übernehmen?Dann lese jeweils zwei Zeilen ein und führe dann das Extrahieren und Hinzufügen zum Vector aus:
string zeile1, zeile2; while (getline(Eingabe, zeile1) && getline(Eingabe, zeile2)) { if (zeile1 == "Abgestimmt") // oder != "Nicht abgestimmt" { textdatei t; // textdatei ist ein blöder Name für die Struktur, besser wäre TabellenEintrag (bzw. DataEntry o.ä). // todo: extrahieren der Zeile zeile2 und Zuweisen zu ... t.Student = ...; t.Modul = ...; Ergebnis.push_back(t); } }
PS: Bei Leerzeichen als Trenner kann man auch einfach direkt aus der
Eingabe
lesen:Eingabe << t.Student << t.Modul;
(und dann
&& getline(Eingabe, zeile2)
im Code oben löschen)
Nur das mit dem Semikolon verstehe ich nicht...