C# Lauflängencodierung decodieren Fehler?

Madagaska

Cadet 3rd Year
Registriert
Jan. 2011
Beiträge
36
Hallo,

ich will die Langlängencodierung entcoden. Ich habe es folgendermasen probert: in der text string schreibe ich einen codierten text.
In der forschleife laufe ich die string text durch, Wenn die ausgewählte Stelle eine Zahl ist Zahl in Zahl int speichern. Wenn es keine Zahl ist will ich abfragen ob der Wert "#" ist (Das geht aber noch nicht) dann soll er die if beenden. Wenn der wert kein "#" ist wieder abgefragt ist der zähler größer 0 dann soll der buchstabe sooft ausgegeben werden wie der Zähler groß ist. Sonst buchstabe nur einmal ausgeben.

Code:
            string text = "a#4b2c2i3llöp";
            string kontrollzeichen = "#";
            char buchstabe;
            int zähler = 0;


            for (int i = 0; i < text.Length; i++)
            {
                buchstabe = text[i];
                if (char.IsDigit(text[i]))///Wenn es eine Zahl ist
                {
                    zähler = text[i];
                }
                      else if (kontrollzeichen == buchstabe)
                {
                    //do nothing

                }
                else if (zähler > 0)
                {
                    for (int j = 0; j < zähler; j++)/
                    {
                        Console.Write(buchstabe);///Wenn Zahl davor, wir der Buchstabe sooft ausgegeben
                    }
                              zähler = 0;    
                    }
                    else
                    {
                        Console.Write(buchstabe);///Keine Zahl davor, dann nur Buchstabe ausgeben
                    }
                }
Die Ausgabe sieht so aus:
a#b(52 mal)c(52 mal)i(52 mal)l(52 mal)löp
Die sollte aber so aussehen:
abbbbcciillllöp

Mein Probleme sind jetzt, die Abfrage ob der Wert gleich "#" ist funktioniert noch nicht.
Und wenn er in die Schleife geht um den buchstaben sooft wie der Zähler groß ist auszugeben, gebt er den Zähler immer 52 mal aus.

ich hoffe ihr kennt denn Fehler erkennen, schonmal danke im vorraus

gruß Madagaska
 
Mach aus dem Kontrollzeichen einen char. Das könnte das Problem sein. Du vergleichst ja einen string mit einem Char. Der String hat aber nach dem # noch ein \0 . Dann meint C wohl, dass die beiden Variablen nicht gleich sind.
 
hier meine Version die Funktioniert :)

Code:
string text = "a#4b2c2i3llöp";
            string kontrollzeichen = "#";
            string buchstabe;
            int zähler = 0;
           
                for (int i = 0; i < text.Length; i++)
                {
                    buchstabe = text[i].ToString();
                    if (char.IsDigit(text[i])) ///Wenn es eine Zahl ist
                    {
                        zähler = Convert.ToInt32(buchstabe);
                    }
                    else if (kontrollzeichen == buchstabe.ToString())
                    {
                        //do nothing

                    }
                    else if (zähler > 0)
                    {
                        for (int j = 0; j < zähler; j++)
                        {
                            Console.Write(buchstabe); ///Wenn Zahl davor, wir der Buchstabe sooft ausgegeben
                        }
                        zähler = 0;
                    }
                    else
                    {
                        Console.Write(buchstabe); ///Keine Zahl davor, dann nur Buchstabe ausgeben
                    }
                }
            Console.ReadLine();
 
Zuletzt bearbeitet:
Ich vermute mal, dass du dich bei deinem Ergebnis verzählt hast ;). So wie du es programmiert hast müsste raus kommen:
a#b(52 mal)c(50 mal)i(50 mal)l(51 mal)löp ;)
Der Grund ist einfach, denn du wandelst das Zeichen '4' (und die anderen Zahlen) nicht in eine Zahl um. Als Char steht es dann für 0x32 (4) im Zehnersystem macht das 52.

Für die Ganze Geschichte kannst du dann etwas schneller arbeiten, wenn du int.tryParse nimmst. Die Methode liefert wahr oder falsch zurück, je nachdem ob es sich um eine Zahl handelt oder nicht. Zudem hat sie ein out welches eben diese Zahl ist.

Code:
int zahl;
if(int.tryParse(text[i], out zahl)
{
     while(zahl != 0) // oder for-Schleife
     {
     Console.Write(text[i+1]);
     zahl--;
     }
i++;
}
Nicht ausgetestet, sollte aber funktionieren. Kann allerdings sein das int.tryParse nur einen string nimmt, dann musst du ggf. noch toString() anhängen. (Das ist auch nur ein Ausschnitt nicht das komplette Programm, fällt hoffentlich auf ;))
 
Danke für die schnellen Antworten, jetzt funktioniert. ;)

EDIT:
Da ich kein neues Thema aufmachen wollte schilder ich hier schnell mein hoffentlich letztes Hindernis

Code:
string text = "a#4b2c2i3llöp";    
string Pfad_Codiert = "Text_Codiert.txt";        
string kontrollzeichen = "#";
            char buchstabe;
            int zahl;

            for (int i = 0; i < text.Length; i++)
            {
                buchstabe = text[i];

                if (int.TryParse(text[i].ToString(), out zahl))
                {
                    while (zahl != 0)
                    {
                        using (StreamWriter SR = new StreamWriter(Pfad_Decodiert))
                        {
                            SR.Write(text[i + 1]);
                        }
                        Console.Write(text[i + 1]);
                        zahl--;
                    }
                    i++;
                }
                else if (kontrollzeichen == buchstabe.ToString())
                {
                    //do nothing
                }
                else
                {
                    using (StreamWriter SR = new StreamWriter(Pfad_Decodiert))
                    {
                        StreamWriter SR = new StreamWriter(Pfad_Decodiert);
                        SR.Write(buchstabe);
                    }
                    Console.Write(buchstabe);
                }
            }
        }

Die Methode funktioniert ja soweit schon, jetzt will ich das Ergebnis auch in eine Textdatei ausgeben. Was ich nicht verstehe ist das in der Textdatei nach dem Ausführen immer nur der letzte Buchstabe steht.

gruß Madagaska
 
Zuletzt bearbeitet:
Er wird wohl den Dateiinhalt überschreiben.
Mit new StreamWriter(Pfad_Decodiert, true) hängt er die Daten an, statt sie zu überschreiben.

Die Konstruktion, so wie du sie gebaut hast, ist ungünstig. Er öffnet zig Mal pro Sekunde eine Datei, schreibt ein einziges Zeichen rein und schließt die Datei wieder. Das heißt, die meiste Zeit verbringt dein Programm damit, auf das Ende der Dateioperationen zu warten. Besser ist es hier, die Datei vor der Schleife zu öffnen, in der Schleife zu schreiben (die Zeichen werden automatisch gepuffert, bis irgendwann ein manuelles oder automatisches Flush-Ereignis auftritt) und nach der Schleife wieder zu schließen.

Btw, warum erzeugst du das StreamWriter-Objekt zweimal hintereinander? Das using reicht doch aus. O.o
 
Zuletzt bearbeitet:
Zurück
Oben