Inhalt umwandeln
-
Die tolower habe ich von Buch aus abgeschrieben
Die tolower aus dem Buch:
void tolower(string& s) { for (int i = 0;i<s.length();++i) s[i] = tolower(s[i]); }Und dann wurden zwei Parameter übergeben, ob das richtig ist weiß ich nicht.
Genau ich will das Ergebnis in die neue Textdatei geschrieben werden soll.
-
Dann hast du's falsch abgeschrieben. Den zweiten Parameter verwendest du nicht, brauchst also auch nicht. Wenn ich mir die letzte Version der Funktion anschaue... erzeugt sie nicht eine Rekursion? Schön find ich sie irgendwie nicht.
-
Eine neuen Fehler wurde entdeckt, wenn man aus der Textdatei ließt dann wird der Inhalt gelöscht.
Und tolower habe ich überarbeitet:
string tolower(const vector <string>& txt) { string s; for (int i = 0;i<s.length();++i) s[i]= tolower(s[i]); return s; }Und der Aufruf der Funtion:
ostr << tolower(txt);Die neue einlese:
while (getline(istr,name2)) { if (! istr || istr.fail() || istr.bad()) { cout << "Fehler beim Einlesen\n"; } else { txt.push_back(name2); cout << name2 << endl; } }
-
Zum Einlesen:
1. Wie kommst du da drauf, dass es das Einlesen ist, welches den Inhalt löscht?
2. Dein Code zeigt: Du kannst (falsch) abschreiben, aber du hast nichts verstanden
.
-
Also nach dem einlesen aus der Textdatei wird der Inhalt in der Datei gelöscht. Die Textdatei war vor dem einlesen 39 Byte groß und nach dem einlesen ist es 0 Byte groß.
Die tolower Funktion von den ich abgeschrieben habe war selbst definiert, meine nicht ich habe sie geschreieben sondern der Autor der Buches.
-
winux schrieb:
Also nach dem einlesen aus der Textdatei wird der Inhalt in der Datei gelöscht. Die Textdatei war vor dem einlesen 39 Byte groß und nach dem einlesen ist es 0 Byte groß.
Du folgerst bestimmt falsch. Du müsstest das Einlesen dafür nämlich einzeln getestet haben und irgendwie traue ich dir nicht zu, dass du das getan hast.
Die tolower Funktion von den ich abgeschrieben habe war selbst definiert, meine nicht ich habe sie geschreieben sondern der Autor der Buches.
Ich rede davon, was du bezüglich des Einlesens von mir und pumuckl abgeschrieben hast.
-
@winux: Code aus irgendwelchen Stellen im Netz zusammenzukopieren ist sinnfrei. Nimm dir bitte ein Anfängerbuch und lerne die Sprache. Sonst wirst du nie verstehen, was dein Code wirklich macht, und vor allem wirst du nicht weit kommen. Wenn du wild herumprobierst ist es für uns hier ziemlich müßig, dir jedesmal zu sagen, dass du beim Copy&Paste wieder einen Fehler gemacht hast.
-
Habe eine Code korrektur gemacht, doch der Compiler sagt:
Fehler 2 error C2664: 'tolower': Konvertierung des Parameters 1 von 'std::string' in 'int' nicht möglichifstream istr("Name.txt",ios_base::in); if(!istr) cout << "Fehler beim Oeffnen der Eingabedatei" << endl; vector <string> txt; string name; while (getline(istr,name)) { if (! istr || istr.fail() || istr.bad()) { cout << "Fehler beim Einlesen\n"; } else { txt.push_back(name); } } ofstream ostr("Name2.txt",ios_base::out); if(!ostr) cout << "Fehler beim Oeffnen der Ausgabedatei" << endl; for (int i = 0;i<txt.size();++i) { txt[i] = tolower(txt[i]); // und hier ist der Fehler ostr << txt[i] << endl; cout << txt[i] << endl; } keep_window_open(); return 0;
-
Satz 1: Du sollst nicht C und C++ mischen, ohne genau zu wissen, was du dort tust.
Korollar: Du sollst nicht einfach Sachen aus dem Netz zusammenklicken.
Satz 2: Wenn man nicht weiß, was eine Funktion genau macht und wie sie deklariert ist, guckt man in eine Referenz und schlägt diese nach.
edit: Falls du verwirrt bist: Du hast nicht deine eigene to_lower Funktion benutzt, sondern die aus der Standardbibliothek, die einen int erwartet. Deine eigene to_lower-Funktion hat eine andere Signatur.
-
Habe nichts aus dem netz zusammengeklickt. Die Code beispiele sind aus dem Buch von dem ich C++ lernen, oder besser gesagt Herr Stroustrup hat sie geschrieben.
-
winux schrieb:
Habe nichts aus dem netz zusammengeklickt. Die Code beispiele sind aus dem Buch von dem ich C++ lernen, oder besser gesagt Herr Stroustrup hat sie geschrieben.
Ich habe dir oben noch was reineditiert, was dir auch beim konkreten Problem helfen sollte.
-
Dann muss halt eine eigene tolower Funktion her.
EDIT:
Nach langem hin und her habe ich es danke eure Hilfe und Tipps geschafft. Endlich Funktioniert alles so wie es soll.string tolower(string& s) { for (int i = 0;i<s.size();++i) s[i] = tolower(s[i]); return s; } int main() { ifstream istr("Name.txt",ios_base::in); if(!istr) cout << "Fehler beim Oeffnen der Eingabedatei" << endl; vector <string> txt; string name; while (getline(istr,name)) { if (! istr || istr.fail() || istr.bad()) { cout << "Fehler beim Einlesen\n"; } else { txt.push_back(name); } } ofstream ostr("Name2.txt",ios_base::out); if(!ostr) cout << "Fehler beim Oeffnen der Ausgabedatei" << endl; for (int i = 0;i<txt.size();++i){ tolower(txt[i]); ostr << tolower(txt[i]) << endl;} keep_window_open(); return 0; }Die Textdatei:
Wie Geplant Trafen Die Gaeste Ein DannUnd dann korrekte die Ausgabe:
wie geplant trafen die gaeste ein dann
-
Das sieht sogar fast gut aus. Ein paar Kommentare:
**
Wichtig:**Deine tolower-Funktion verändert das Original und gibt dann nochmals eine Kopie zurück. Entweder ändere das Original und gib nichts zurück oder mach eine Kopie, ändere diese und gib diese zurück. Nicht beides.
Die Ausgabe für die falsche Eingabe kann niemals erreicht werden, denn wenn beim Einlesen eines der Fehlerflags gesetzt wird, dann bricht die while-Schleife bereits ab. Du könntest, wenn du möchtest, aber nach der while-Schleife testen, ob der Abbruch durch das Dateiende (also normal) oder durch etwas anderes (Fehler) verursacht wurde. Aber abgesehen von einem echten Festplattenfehler kann an der Stelle eigentlich nichts passieren.
Kleinigkeiten:
Das ios_base::out in Zeile 26 kannst du dir sparen, das ist bereits der Standardparameter für den ofstream. Ebenso in Zeile 9.
Deine Bedingung in Zeile 16 ist, selbst wenn sie überhaupt erreicht würde, redundant. denn durch das !istr sind fail und bad bereits eingeschlossen. Und weiterhin schließt fail() auch bereits bad() ein.
-
Danke für den Tipp.