Umlaute-Programm



  • Hi,
    ich muss ein Programm schreiben, das aus einer geschriebenen Textdatei, die Umlaute in normale Buchstaben umwandelt (also ä in ae, ü in ue, usw...). Bekomm dat aber irgendwie net auf die Reihe, die Textdatei auslesen zu lassen. Ich hab schon überall gesucht, komme aber net klar. (Würde mich auch über fertige Programme freuen)

    Thx im voraus.



  • Hallo,
    hast du das schon gelesen?
    Wenn ja, was genau ist unklar?



  • Also ich sollte wohl erstmal dazu sagen, das ich im Programieren ein absoluter Newbee bin. Ich hatte erst ein paar Stunden Programieren in der Schule (so ganz billig, mit "Hallo Welt" und so). Jetzt hab ich aber Praktikum und soll das als Aufgabe machen. Nee, das hatte ich noch nicht gelesen, hab's auch soweit geschafft, die Datei einlesen zu lassen, jetzt häng ich, das die Umlaute gesucht und umgewandelt werden.

    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() )
      {
      vector<string> Contents;
      for (string ReadString; getline(examplefile, ReadString); )
            Contents.push_back(ReadString);
    
            \\Was muss jetzt hier hin?
    
            ostream_iterator<string> Out(cout, "\n");
            copy(Contents.begin(), Contents.end(), Out);
            getch();
    
      }
      return 0;
    }
    

    Ach und danke!



  • Erstmal würde ich den vector an der Stelle weglassen (sonst gibt das Programm für jede Zeile den kompletten bisherigen Text aus.

    Und zweitens: versuch' mal string::find() (zum aufspüren der Umlaute) und string::replace() (zum Ersetzen gegen "ae" etc)



  • Was genau meinst du das mit vector weglassen? (Also wie gesagt, ich bin ein absoluter Newbee). Und bei sting::find (ä) meckert er rum, das ä ein ungültiges char Zeichen ist.



  • Ich mein natürlich string::find (ä);



  • SolidSnake schrieb:

    Was genau meinst du das mit vector weglassen? (Also wie gesagt, ich bin ein absoluter Newbee).

    So, wie das Programm jetzt dasteht, würde es aus dem Text:

    Dies ist ein Test
    Der Test geht weiter
    Und wir testen immer noch
    

    das da machen:

    Dies ist ein Test
    Dies ist ein Test
    Der Test geht weiter
    Dies ist ein Test
    Der Test geht weiter
    Und wir testen immer noch
    

    (Du hängst am Anfang der Schleife die aktuelle Eingabe an den Vektor an und gibst am Ende dessen kompletten Inhalt aus)

    Bessere Lösung:

    for (string ReadString; getline(examplefile, ReadString); )
    
            \\Was muss jetzt hier hin?
    
            cout<<ReadString<<endl;
            getch();
    }
    

    (oder setz die Ausgabe hinter die for()-Schleife)

    Und bei sting::find (ä) meckert er rum, das ä ein ungültiges char Zeichen ist.

    Das liegt daran, daß Zeichen-Konstanten in '' eingeschlossen werden sollten 😉



  • Ok, danke. Aber wenn ich das in ("") setzte, sagt er das er keine Übereinstimmung gefunden hat.



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


Anmelden zum Antworten