Umlaute-Programm
-
Aber der Text ist: "Das ist ein Täst". Was mache ich falsch?
-
SolidSnake schrieb:
Aber der Text ist: "Das ist ein Täst". Was mache ich falsch?
Stimmt dein Aufruf des replace algos? (http://www.cppreference.com/cppalgorithm/replace.html)
-
Mach mal die Probe:
string test="Dies ist ein Täst"; cout<<test.find('ä')<<":"<<test;das sollte eigentlich 13 zurückliefern.
(Was noch sein könnte: die Umlaute werden unter ANSI (Windows) und ASCII (DOS/C) anders dargestellt)
Edit @GPC: Unterscheide bitte den replace()-Algorithmus und string::replace() (ersterer wird hier nicht anwendbar sein, weil du ein Zeichen ('ä') gegen mehrere ("ae") austeuschen willst).
-
Stimmt dein Aufruf des replace algos?
Was meinst du damit?Beim Test gibt er mir 14:Das ist ein Töst
So sieht mein Programm jetzt aus
int main () { char buffer[256]; ifstream examplefile ("E:\\Dokumente und Einstellungen\\Administrator\\Desktop\\Test\\datei.txt"); if (! examplefile.is_open()) { cout << "Error opening file"; getch(); } while (! examplefile.eof() ) { for (string ReadString; getline(examplefile, ReadString); ) string::find ("ä"); string::replace ("ae"); cout<<ReadString<<endl; getch(); } return 0; }
-
Der Aufruf kann so nicht funktionieren, string merkt sich die Suchposition nicht intern für weitere Arbeiten:
size_type pos; while((pos=ReadString.find('ä'))!=npos) ReadString.replace(pos,1,"ae");
-
Edit @GPC: Unterscheide bitte den replace()-Algorithmus und string::replace() (ersterer wird hier nicht anwendbar sein, weil du ein Zeichen ('ä') gegen mehrere ("ae") austeuschen willst).
Hatte ich wohl übersehen.
-
So, bin wieder da. Durfte den Keller aufräumen.
CStoll schrieb:
Der Aufruf kann so nicht funktionieren, string merkt sich die Suchposition nicht intern für weitere Arbeiten:
size_type pos; while((pos=ReadString.find('ä'))!=npos) ReadString.replace(pos,1,"ae");Wie meinst du das? Wenn ich das reinschreibe, meckert er "undifiniertest Symbol 'size_type'.
Also wie mach ich das jetzt?
-
ups - das heißt natürlich "string::size_type" (und - ehe du den nächsten Fehler anmeldest - "string::npos").
Du merkst dir in pos die letzte Fundstelle des Umlautes und ersetzt dann dieses Zeichen durch den entsprechenden Austauschtext.
-
Da is wohl immer noch was falsch (oder ich mach immer noch was falsch). Jetzt sagt er :
[C++ Fehler] Test3.cpp(32): E2451 Undefiniertes Symbol 'pos'
[C++ Fehler] Test3.cpp(32): E2108 Ungültige Verwendung von typedef 'string'
[C++ Fehler] Test3.cpp(32): E2293 ) erwartet
[C++ Fehler] Test3.cpp(33): E2377 In While-Anweisung fehlt )
[C++ Fehler] Test3.cpp(35): E2451 Undefiniertes Symbol 'ReadString'
[C++ Fehler] Test3.cpp(40): E2040 Deklaration nicht ordnungsgemäß abgeschlossen
[C++ Fehler] Test3.cpp(41): E2190 Unerwartetes }int main () { char buffer[256]; ifstream examplefile ("E:\\Dokumente und Einstellungen\\Administrator\\Desktop\\Test\\datei.txt"); if (! examplefile.is_open()) { cout << "Error opening file"; getch(); } while (! examplefile.eof() ) { for (string ReadString; getline(examplefile, ReadString); ) string::size_type pos; while((pos=ReadString.find('ä'))!=string::npos) ReadString.replace(pos,1,"ae"); cout<<ReadString<<endl; getch(); } } return 0; }Also, was hab ich falsch gemacht? Ist das richtig eingesetzt?
-
vielleicht solltest du hinter das for() auch eine { Klammer machen
(sonst wiederholt die nur die Variablendeklaration bis zum Dateiende)
-
Perfekt! Es funktioniert!! Jetzt muss ich nur noch die anderen Umlaute auch noch dazufügen. Aber dat versuch ich grad erstmal so. Vielen Dank!!! Warst mir echt ne große Hilfe!!!!

-
So, hab das auch mit den anderen Umlauten geschafft. Jetzt wollte ich aber, das es vorher fragt, welche Datei gelesen wird. Und habe folgendes gemacht:
int main () { char buffer[256]; int datei; cout<<"Bitte Dateipfad angeben\n"; cout<<"Dateipfad:"; cin>>"datei"; ifstream examplefile ("datei"); if (! examplefile.is_open()) { cout << "Error opening file"; getch(); exit(1); } while (! examplefile.eof() ) { for (string ReadString; getline(examplefile, ReadString); ) { string::size_type pos; while((pos=ReadString.find('ä'))!=string::npos) ReadString.replace(pos,1,"ae"); while((pos=ReadString.find('ü'))!=string::npos) ReadString.replace(pos,1,"ue"); while((pos=ReadString.find('ö'))!=string::npos) ReadString.replace(pos,1,"oe"); while((pos=ReadString.find('ß'))!=string::npos) ReadString.replace(pos,1,"ss"); while((pos=ReadString.find('Ü'))!=string::npos) ReadString.replace(pos,1,"Ue"); while((pos=ReadString.find('Ä'))!=string::npos) ReadString.replace(pos,1,"Ae"); while((pos=ReadString.find('Ö'))!=string::npos) ReadString.replace(pos,1,"öe"); cout<<ReadString<<endl; getch(); } } return 0; }Wenn ich aber dann einen Pfad angebe, sagt er "Error opening file" (Also in der Konsole).
Ich hab es auch schonmal so gemacht:"ifstream examplefile (datei);".
Dann sagt er es nicht, schreibt aber nur "u.txt" an. Also, was ist falsch?
-
SolidSnake schrieb:
char buffer[256]; int datei; cout<<"Bitte Dateipfad angeben\n"; cout<<"Dateipfad:"; cin>>"datei"; ifstream examplefile ("datei");Das kann so auch nicht ganz funktionieren - wenn du "datei" angibst, nimmt er genau diese Zeichenfolge als Dateiname. Du mußt den Namen in einem String einlesen und dann die Variable angeben:
string dateiname; cout << "Bitte Pfad angeben:"; cin >> dateiname; ifstream examplefile(dateiname);//eventuell brauchst du auch ifstream examplefile(dateiname.c_str());
-
Ok. Jetzt klappt's! Vielen Dank nochma! Noch ne Frage: Gibt es eine Möglichkeit, das sofort der ganze Inhalt der Datei angezeigt wird, nich nur Zeilenweise?
-
Ich hab alles soweit hinbekommen. Nur hatte ich mir das von meiner Praktikumsstelle auch nach Hause geschickt (per E-Mail) und jetzt funtzt es net mehr (also es kommt in der Konsole immer "Error ...", ich kann halt keine Datei öffnen). Macht es ein Unterschied wenn ich das mit Borland Builder 6 oder Borland Builder 6 Enterprise öffne? Ich kopier hier noch mal das ganze Programm rein, vielleicht is ja irgendwie was falsch.
int main () { char buffer[256]; string dateiname; cout<<"Bitte Dateipfad angeben\n"; cout<<"Dateipfad:"; cin>>dateiname; ifstream examplefile (dateiname.c_str()); if (! examplefile.is_open()) { cout << "Error opening file"; getch(); exit(1); } while (! examplefile.eof() ) { for (string ReadString; getline(examplefile, ReadString); ) { string::size_type pos; while((pos=ReadString.find('ä'))!=string::npos) ReadString.replace(pos,1,"ae"); while((pos=ReadString.find('ü'))!=string::npos) ReadString.replace(pos,1,"ue"); while((pos=ReadString.find('ö'))!=string::npos) ReadString.replace(pos,1,"oe"); while((pos=ReadString.find('ß'))!=string::npos) ReadString.replace(pos,1,"ss"); while((pos=ReadString.find('Ü'))!=string::npos) ReadString.replace(pos,1,"Ue"); while((pos=ReadString.find('Ä'))!=string::npos) ReadString.replace(pos,1,"Ae"); while((pos=ReadString.find('Ö'))!=string::npos) ReadString.replace(pos,1,"öe"); cout<<ReadString<<endl; getch(); } } return 0; }
-
Stimmt der Dateipfad (bei relativen Angaben könnte es Probleme mit dem Ausgangspunkt geben)?
Ansonsten: Je länger ich den Quelltext ansehe, desto stärker fällt auf, daß eine der Schleifen (while oder for) wohl überflüssig ist.
-
Ja, der Pfad stimmte, aber das das jetzt nicht bei mir zu Hause geklappt hat ist nich so schlimm. Muss ich später mal gucken. Aber mit welchen Befehl mach ich das jetzt, das der die umgewandelte nicht mal auf dem Bildschirm anzeigt, sondern direkt in eine neue Datei speichert?
-
am einfachsten, indem du cout durch einen fstream ersetzt:
//in dem Gebiet, wo du auch deine Eingabedatei festlegst - wenn du willst, kannst du den Dateinamen auch vorher abfragen: ofstream ofile("outfile.txt"); //Zum Schreiben wert: (anstelle der "cout<<wert;" Aufrufe) ofile<<wert;
-
Wie meinst du das jetzt genau?
int main () { char buffer[256]; string dateiname; cout<<"Bitte Dateipfad angeben\n"; cout<<"Dateipfad:"; cin>>dateiname; ifstream examplefile (dateiname.c_str()); if (! examplefile.is_open()) { cout << "Error opening file"; getch(); exit(1); } while (! examplefile.eof() ) { for (string ReadString; getline(examplefile, ReadString); ) { string::size_type pos; while((pos=ReadString.find('ä'))!=string::npos) ReadString.replace(pos,1,"ae"); while((pos=ReadString.find('ü'))!=string::npos) ReadString.replace(pos,1,"ue"); while((pos=ReadString.find('ö'))!=string::npos) ReadString.replace(pos,1,"oe"); while((pos=ReadString.find('ß'))!=string::npos) ReadString.replace(pos,1,"ss"); while((pos=ReadString.find('Ü'))!=string::npos) ReadString.replace(pos,1,"Ue"); while((pos=ReadString.find('Ä'))!=string::npos) ReadString.replace(pos,1,"Ae"); while((pos=ReadString.find('Ö'))!=string::npos) ReadString.replace(pos,1,"Öe"); ofstream ofile("neu2.txt"); ofile<<ReadString<<endl; } } return 0; }So doch net.
-
So könnte es zur Not auch gehen, aber ich würde das Ausgabefile lieber etwas weiter vorne anlegen (direkt hinter dem "ifstream examplefile(...);").