Umlaute-Programm



  • 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.



  • @1: Du kannst das Anlegen des Ausgabefiles auf nach der if(!input.is_open()) Überprüfung erledigen.
    @2: Wo genau liegt da das Problem?

    PS: Sorry, wenn ich n icht immer konsistent mit den Variablennamen bin.



  • Ach, das ist nicht so schlimm mit den Variablennamen. Du machst dir ja schon so viel Arbeit. Also 2. ich soll das Programm so machen, das man über Dos (also ausführen, cmd oder command) sagen kann z.B.:
    Umlauteprogramm datei.txt (was jetzt kommt habe ich grade erst erfahren. Also der soll doch net aus datei.txt datei2.txt machen, sondern man soll selber den neuen Namen einsetzten. Also jetzt:) neudateiname.txt



  • Scheiße. Seh ich das richtig, dass ich (eigentlich du) mir voll viel Arbeit umsonst gemacht habe (also umsonst kann man das nicht nennen, schließlich hab ich was dabei gelernt)? Und das ich voll viel umbauen muss, damit das jetzt so klappt. Kann das sein? 😮



  • achso: dafür mußt du die main ändern in

    int main(int argc,char*argv[])
    {
      if(argc<2) exit;
      string dateiname=argv[1];
      string dateiname2=argv[2];
    
      //...
    }
    

    (zur Erklärung: in argc wird die Anzahl der übergebenen Kommandoparameter geliefert*, in argv ein Array mit den einzelnen Parameterwerten (argv[0] ist der Programmname))

    *statt abzubrechen, wenn zu wenige Parameter vorliegen, kannst du auch nach anderen Möglichkeiten suchen, den Dateinamen zu bekommen, z.B.:

    string dateiname,dateiname2;
    switch(argc)
    {
    case 0://keine Parameter angegeben - wir fragen den Nutzer:
      cout<<"Bitte Datei angeben:";
      cin>>dateiname;
      //hier ist absichtlich kein "break;"
    case 1://nur ein Parameter - Ausgabe in input+"2":
      {
        dateiname=argv[1];
        int pos=dateiname2.find_last_of(".");
        if(pos!=string::npos)
          dateiname2.replace(pos,1,"2.");
        else
          dateiname+="2";
      }
      break;
    default://mindestens zwei Parameter:
      dateiname=argv[1];
      dateiname2=argv[2];
    }
    


  • Ok. Ich denke ich hab das jetzt so wie es sein sollte. Hier nochmal der ganze Code:

    #include <vcl.h>
    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include <fstream.h>
    #include <vector.h>
    #include <string.h>
    #include <iterator.h>
    #include <stdlib.h>
    #include <io.h>
    #include <algorithm.h>
    
    int main(int argc,char*argv[])
    {string dateiname,dateiname2; 
    switch(argc) 
    {
    case 0:
      cout<<"Bitte Datei angeben:";
      cin>>dateiname;
    
    case 1:
      {
        dateiname=argv[1]; 
        int pos=dateiname2.find_last_of("."); 
        if(pos!=string::npos) 
          dateiname2.replace(pos,1,"2."); 
        else 
          dateiname+="2"; 
      } 
      break; 
    default: 
      dateiname=argv[1]; 
      dateiname2=argv[2]; 
    }
    
      ifstream input(dateiname.c_str());
    
      if (! input.is_open())
      { cout << "Error opening file";
      getch();
      exit(1);
      }
      ofstream output(dateiname2.c_str());
    
      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");
    
      output<<ReadString<<endl;
    
     }
    
      return 0;
    }
    

    Ich weiß das ich ein paar von den Headerdatein nicht brauche, aber die haben sich im Laufe meiner Suche angesammelt und jetzt weiß ich auch net so genau, welche ich davon brauche und welche nicht. Und da noch rumzutesten wollte ich auch nicht. Ich hoffe, es ist auch richtig, das dei fertige Datei jetzt im Verzeichnis der exe Datei erzeugt wird und nicht im Verzeichnis der Ursprungsdatei. Falls ich das anders machen müsste, was müsste ich denn da verändern?
    Geht das jetzt eigentlich nicht mehr über normal testen? Also ich mein nur, weil wenn ich das jetzt über BorlandBuilder teste, kommt zwar das schwarze Dosfenster, aber es steht nichts drin und dann kommt eine Fehlermeldung. Na ja, was solls.
    Auf jeden vielen, vielen Dank!!!!!!!!!!!!!


Anmelden zum Antworten