Umlaute-Programm
-
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(...);").
-
Ich hab's jetzt so gemacht:
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("C:\\neu2.txt"); ofile<<ReadString<<endl; } } return 0; }Aber jetzt macht der zwar die neu2 datei, es steht aber nur die letzte Zeile übersetzt drin. Muss ich irgendwo Klammern setzten? Und gibt es eine Möglichkeit, das der einfach den Namen der alten Datei nimmt, und eine 2 dranhängt?
-
Natürlich ist hier die Klammer falsch:
while((pos=ReadString.find('Ö'))!=string::npos) ReadString.replace(pos,1,"Öe"); )
-
Du öffnest für jeden String die Datei neu (und im Standard-Modus bedeutet das, daß der vorige Inhalt überschrieben wird. Deshalb besser for der while-Schleife öffnen:
ifstream examplefile(dateiname.c_str()); ofstream ofile("neu2.txt"); if (! examplefile.is_open()) { cout << "Error opening file"; getch(); exit(1); } while (! examplefile.eof() ) { //wie ich oben sagte, das for() ist überflüssig: //for (string ReadString; getline(examplefile, ReadString); ) { string ReadString;getline(examplefile,ReadString); string::size_type pos; while((pos=ReadString.find('ä'))!=string::npos) ReadString.replace(pos,1,"ae"); //... ofile<<ReadString<<endl; }(btw, wenn du "Ö" durch "Öe" ersetzt, landest du in einer Endlosschleife ;))
-
Oh, stimmt. Das mit dem Ö hab ich übersehen. Danke. Ok, jetzt läuft's auch soweit, jetzt nochma die Frage: Gibt es eine Möglichkeit, das der Name der alten Datei genommen wird und nur eine 2 drangehängt wird? Und, kann man einstellen, das der die Datei automatisch in das Verzeichnis reinkopiert, in der die Ursprungdatei auch liegt? Vielen Dank noch mal für Alles!
-
//"2" anhängen: string dateiname = ...; string dateiname2 = dateiname; int pos=dateiname2.find_last_of(".");//findet letztes Vorkommen von "." - Dateiendung if(pos!=string::npos) dateiname2.replace(pos,1,"2."); else dateiname+="2"; //gleiches Verzeichnis: string dateiname = ...; int pos=dateiname.find_last_of("\\/");// "\" oder "/" - Ende des Dateipfades string verz; if(pos!=string::npos) verz=dateiname.substr(0,pos+1); else verz=""; string dateiname2=verz+"ausgabe.txt"; //anschließend Dateien öffnen: ifstream input(dateiname.c_str()); ofstream output(dateiname2.c_str());
-
Aber wenn ich jetzt beides einbauen will, dann kann ich das ja net einfach so:
int main () { char buffer[256]; string dateiname; cout<<"Bitte Dateipfad angeben\n"; cout<<"Dateipfad:"; cin>>dateiname; string dateiname2 = dateiname; int pos=dateiname2.find_last_of("."); if(pos!=string::npos) dateiname2.replace(pos,1,"2."); else dateiname+="2"; int pos=dateiname.find_last_of("\\/"); if(pos!=string::npos) verz=dateiname.substr(0,pos+1); else verz=""; string dateiname2=verz+"ausgabe.txt"; ifstream input(dateiname.c_str()); ofstream output(dateiname2.c_str()); if (! examplefile.is_open()) { cout << "Error opening file"; getch(); exit(1); } while (! examplefile.eof() ) { 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,"Oe"); ofile<<ReadString<<endl; } return 0; }machen. Und was genau meinst du mit "string dateiname = ...;" Soll ich bei ... was einsetzen? Aber danke das du dir so viel Arbeit wegen mir machst!

-
eine Variante reicht (entweder "2" an den Namen anhängen, oder neuen Namen festlegen)

(und das "= ..." ist eine Abkürzung für den gesamten Code, mit dem du deinen Dateinamen einlesen willst - in etwa: "= irgenein Wert, den du dir beschaffen mußt")
-
Meinst du ungefähr so?:
int main () { char buffer[256]; string dateiname; cout<<"Bitte Dateipfad angeben\n"; cout<<"Dateipfad:"; cin>>dateiname; int pos=dateiname.find_last_of("\\/"); string verz; if(pos!=string::npos) verz=dateiname.substr(0,pos+1); else verz=""; string dateiname2=verz+"ausgabe.txt"; ifstream input(dateiname.c_str()); ofstream output(dateiname2.c_str()); if (! input.is_open()) { cout << "Error opening file"; getch(); exit(1); } while (! input.eof() ) { string ReadString;getline(input,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,"Oe"); ofile<<ReadString<<endl; } return 0; }Jetzt bekomme ich eine Fehlermeldung, das "ofile" undefiniert ist.
-
Ach, ist schon klar. Ich muss output nehmen!
-
So, hab das jetzt alles geschafft. Ich habe jetzt nur noch 2 Probleme.
1. Er erzeugt ja auch eine Datei, wenn der Pfad falsch war.
2. Man soll das Programm aus Dos ausführen können.
-
1 Problem hab ich grad gelöst.