Umlaute-Programm



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



  • wie sieht denn sowas dann fertig aus? 🙂


Anmelden zum Antworten