[GELÖST] Unterschiedliche ASCII-Tabellen



  • ||VORHER: "Von fgetc zurückgegebene Zahl stimmt nicht mit ASCII-Tabelle überein"

    Hallo liebe Profis 🙂 !

    Ich bin 15 Jahre alt und seit etwa einem halben Jahr dabei, C++ (bzw. im Moment noch C alleine) zu lernen.

    Im großen und Ganzen komme ich auch recht gut vorwärts.

    An Eigeninitiative mangelt es mir glaube ich auch nicht, ich habe schon vor vielen Programmen tagelang gesessen, um meine Fehler selber zu finden.

    Nun aber komme ich einfach nicht weiter und hoffe, dass ich hier jemanden finde, der mir helfen kann 🙂 !

    Es geht darum, dass mein Programm eine .txt-Datei öffnen soll und alle Sonderzeichen (ü, ö, ä, Ü, Ö, Ä, ß) durch die im ASCII-Satz enthaltenen Zeichen ersetzen soll.

    Ich habe vor 2 Tagen einen Code geschrieben, der meiner Meinung nach dies erfüllen sollte.

    Neben dem Öffnen des Dokuments usw. ist der Hauptbestandteil dabei folgende WHILE/SWITCH-Schleife:

    while ((zeichen = fgetc(datei1)) != EOF)
       {
           switch(zeichen)
           {
               case 129: fputc('u', datei2);
                 fputc('e', datei2);
                 printf("%c wird zu ue!\n", zeichen);
                 break;
               case 132:
                 fputc('a', datei2);
                 fputc('e', datei2);
                 printf("%c wird zu ae!\n", zeichen);
                 break;
               case 148:
                 fputc('o', datei2);
                 fputc('e', datei2);
                 printf("%c wird zu oe!\n", zeichen);
                 break;
               case 142:
                 fputc('A', datei2);
                 fputc('e', datei2);
                 printf("%c wird zu Ae!\n", zeichen);
                 break;
               case 153:
                 fputc('O', datei2);
                 fputc('e', datei2);
                 printf("%c wird zu Oe!\n", zeichen);
                 break;
               case 154:
                 fputc('U', datei2);
                 fputc('e', datei2);
                 printf("%c wird zu Ue!\n", zeichen);
                 break;
               case 225:
                 fputc('s', datei2);
                 fputc('s', datei2);
                 printf("%c wird zu ss!\n", zeichen);
                 break;
               default:
                 fputc(zeichen, datei2);
                 printf("%c bleibt unveraendert!\n", zeichen);
                 break;
           }
    

    "zeichen" ist dabei eine Integer-Variable, die bei der initialisierung auf 0 gesetzt wurde.
    "datei1" ist die Quelldatei, "datei2" die temporär erzeugte Datei.
    Der Kompiler (MinGW 4.4.1, IDE ist Code:Blocks) meldet keine Fehler.

    Mein Problem ist nun aber, dass das Programm zu einem Textdokument, dass - mit wenigen Ausnahmen - nur aus eben den zu ersetzenden Sonderzeichen besteht, trotzdem nur immer wieder "X bleibt unverändert" ausgibt (wobei man hier an der Ausgabe schon erkennt, dass das nicht sein dürfte, da eben diese Zeichen, die für "X" erscheinen und den Sonderzeichen im Quellcode entsprechen, nicht richtig dargestellt werden).

    Ich habe das Programm dann mal so modifiziert, dass anstelle der SWITCH-Schleife immer nur die Variable "Zeichen" ausgegeben wird:

    while ((zeichen = fgetc(datei1)) != EOF)
       {
        printf("%d\n", zeichen);
       }
    

    Dadurch konnte ich feststellen, dass diese Variable immer komplett falsche Werte annimmt.

    So ist das erste Zeichen im Textdokument ein kleines "ü", das modifizierte Programm gibt aber dafür die Nummer "252" aus, was ja eigentlich zu einem anderen Zeichen (der kleinen "3") gehört.

    Ich wollte nun fragen, ob es hier ein bekanntes "Fettnäpfchen" gibt, in das ich getreten bin, oder wo man den Fehler sonst suchen muss 😞 ?

    Falls nötig, kann ich gerne noch Screenshoots der Programmausgabe oder den kompletten Quellcode posten!

    Vielen Dank im Voraus 😋 !

    Philipp

    ||EDIT: Kleinere Rechtsschreibfehler ausgebessert

    ||EDIT 2: Oh, ich habe grade gemerkt, dass die Variable wohl doch den richtigen Wert hat. Ich hatte anscheinend nur eine fehlerhafte ASCII-Zeichen-Tabelle 😞
    Tja, dann experimentiere ich noch ein bisschen mit der neu erlangten Erkenntnis, das "Zeichen" den korrekten Wert hat und poste dann, ob ich das Problem selber lösen konnte!



  • Waldiphil schrieb:

    Ich wollte nun fragen, ob es hier ein bekanntes "Fettnäpfchen" gibt, in das ich getreten bin, oder wo man den Fehler sonst suchen muss 😞 ?

    Deine Eingabe verwendet eine andere Kodierung als von Dir vermutet.



  • Hi,

    Ich habe bisher folgende Tabelle benutzt, die ich auf meiner Festplatte rumliegen hatte:
    http://s1.directupload.net/images/110102/temp/xc5kg3s9.jpg

    Dem kontrovers gegenüber steht diese Tabelle, die ich grade im Internet gefunden habe:
    http://www.torsten-horn.de/techdocs/ascii.htm

    Ich denke mal, letztere stimmt?

    Komisch nur: Das Tutorial, mit dem ich lerne, hat anscheinend erstere Tabelle als Vorlage gehabt 😡 .

    Hat sich da in den letzten Jahren etwas geändert?

    Mein Tutorial ist nämlich nicht mehr das Neueste 🙄 ...

    Ich pass mein Programm jetzt mal an die richtige Tabelle an und denke, das es dann klappt.

    @SG1: Danke für deine Antwort. Mit anders "kodiert" meinst du schon, dass ich die falschen Nummern für die falschen Zeichen verwendet habe?

    Philipp



  • Vermutlich ist die txt-Datei nach ISO 8859-1 kodiert, nicht nach den von Dir gefundenen älteren ASCII-Tabellen:
    http://de.wikipedia.org/wiki/ISO_8859-1
    Dort hat das ü 0xFC = 252.



  • Ah, da gibt es Unterschiede 😮

    Danke, wieder was gelernt 😉 !

    Mit der Tabelle, die passend zu meiner Eingabe ist, hat es nun geklappt und das Programm funktioniert 🙂

    Danke an alle, die diesen Thread gelesen haben und mir zur doch recht simplen Lösung geholfen haben!



  • Es gibt ggf. noch mehr Unterschiede: Eine solche Datei könnte z.B. auch UTF-8-kodiert sein, dann sieht die Sache wieder anders aus. Kann also sein, dass Dein Programm auf einem anderen System nicht funktionert. Wie auch immer, man muss die Kodierung der Datei jeweils wissen und entsprechend dekodieren.

    Weiter viel Erfolg!


Anmelden zum Antworten