StreamReader Zeichen vergleichen??



  • Hallo, ich habe eine codierte .txt Textdatei, bei der jeder Buchstabe um einen Wert verschoben wurde (B entspricht A usw.) ich möchte nun mit StreamReader JEDES EINZELNE ZEICHEN vergleichen und das korrekte Ausgeben.

    Bei Win32 Anwendungen gabs ja immer String Compare, aber eineähnlihce Funktion hab ich für Forms anwendungen noch nicht gefunden.

    if (strcmp(speicher.zeichen,"B")==0){cout<<"A";}
    

    Im Internet find ich auch nichts derartiges. Wäre echt toll wenn mir wer helfen könnte. Danke!





  • Wenn du viel Zeit hast und halbwegs fit bist könntest du mal prüfen ob du dir selber ein Encoding bastelst und es auf den Stream anwendest.



  • witte schrieb:

    Wenn du viel Zeit hast und halbwegs fit bist könntest du mal prüfen ob du dir selber ein Encoding bastelst und es auf den Stream anwendest.

    Wo ist da der Zusammenhang?
    Simon



  • Na wenn er sich ein eigenes Encoding mit einem eigenen Encoder definiert 'A'=>'B' kann er damit seinen Stream lesen ohne sich weiter um die Verschlüsselung kümmern zu müssen. Der Stream verwendet seinen Encoder, dieser wandelt Byte 65 in 'B' um. Ich habe ja nicht behauptet dass der Weg einfach oder praktikabel ist.



  • encoder? decoder? erinnert mich an das alte premiere.

    hab jetzt folgendes versucht

    if (sr->Peek()=="A"){this->textBox3->Text += L"B";}
    

    klappt leider noch immer nicht ... auch if(strcmp(sr->Peek(),"A")=00)... macht er nicht. habt ihr vielleicht ein codeschnipsel oder so. die msdn hat mir da wirklich nicht weiter geholfen.



  • using namespace System;
    using namespace System::IO;
    using namespace System::Diagnostics;
    
    int main(array<System::String ^> ^args)
    {
        StreamReader^ sr = gcnew StreamReader(L"test.txt");
    
        if (sr->Peek() == L'A')
        {
            Debug::WriteLine(L"Oh, it was an \'A\'");
        }
        if (sr->Peek() == L'B')
        {
            Debug::WriteLine(L"Oh, it was an \'B\'");
        }
    
        delete sr;
    
        return 0;
    }
    


  • danke theta 🙂 funzt soweit super, habe nur das problem, das er mir nur immer das erste zeichen ausgibt und nicht nacheinander den ganzen text in korrekter reihenfolge:

    do
    {
    if (sr->Peek()==L'A'){this->textBox3->Text += L"B";}else{}	
    if (sr->Peek()==L'B'){this->textBox3->Text += L"C";}else{}
    if (sr->Peek()==L'C'){this->textBox3->Text += L"D";}else{}	
    if (sr->Peek()==L'D'){this->textBox3->Text += L"E";}else{}
    if (sr->Peek()==L'E'){this->textBox3->Text += L"F";}else{}	
    if (sr->Peek()==L'F'){this->textBox3->Text += L"G";}else{}
    ...usw...
    }
    while ( sr->Peek() >= 0 );
    

    mit der do-while schleife schmiert mir das programm immer ab...



  • Peek() gibt dir das Zeichen an der aktuellen Position zurück OHNE es zu konsumieren. Read() dasselbe aber das Zeichen wird konsumiert!

    Simon



  • ich hoffe wir sind hier nicht bei der unendlichen geschichte:

    Wenn ich jetzt:

    ...
    if (sr->Read()==L'B'){this->textBox3->Text += L"A";}else{}
    ...
    

    eingebe erhalte ich folgende Fehlermeldungen:

    error C2446: '==': Keine Konvertierung von 'const char *' in 'int'

    und

    error C2040: '==': 'int' unterscheidet sich von 'const char [2]' in Bezug auf die Anzahl vorgenommener Dereferenzierungen

    Simon, hast du ne Idee?



  • 1. Du musst EINMAL Read(..) aufrufen, den Inhalt in ein int oder char speicher (weiss grad nicht was Read(..) zurückgibt) und danach mit dieser Variable den Vergleich vornehmen. Wie gesagt, Read(..) entfernt ein Zeichen vom Stream!!

    2. Schreibe doch dein Code mehrzeilig, dann zeigt Dir VS auch genau wo das Problem liegt.

    Hier mal ein Bsp:

    StreamReader sr(L"test.txt");
    
    while (!sr.EndOfStream)
    {
        int ch = sr.Read();
        if (L'A' == ch)
        {
            Debug::WriteLine(L" -- A");
        }
        else if (L'B' == ch)
        {
            Debug::WriteLine(L" -- B");
        }
        //...
    }
    

Anmelden zum Antworten