Problem beim Einlesen einer Datei



  • Hi,

    hoffe mir kann hier jemand helfen. Ich möchte unter c++ eine Datei einlesen.

    526561676565202004500102000C000C01010000167F7F5555

    Dies ist der Inhalt der TXT Datei. Ich weiß auch wie ich den Inhalt zu bewerten habe.

    52 = R
    65 = e
    61 = a
    67 = g
    65 = e
    65 = e
    20 = leer Zeichen
    20 = leer Zeichen

    ab hier als Zahl
    04 = 4
    50 = 80
    01 = 1
    02 = 2
    00 = 0
    0C = 12
    00 = 0
    0C = 12
    01 = 1
    01 = 1
    00 = 0
    00 = 0
    16 = 22
    7F = 127
    7F = 127
    55 = 85
    55 = 85

    So weit so gut. Wenn ich jetzt die Datei einfach z.B. in ein char[86] einlese habe ich dem entsprechent test[0] = 5, test[1] = 2, test[2] = 6 und so weiter. Ich müßte jetzt also test[0] und test[1] zusammenfassen zu 52 und dieses wieder einem char zuweisen. Ich habe aber keine Idee wie das geht!!!!

    Ich weiß auch nicht wie man so eine Ausgabe erzeugen soll!!!

    Würde mich freuen wenn sich jemand meldet.

    PS.: Ich muß ca. 10000 Zeilen von dieser Struktur einlesen.

    Mit freundlichen Grüßen
    Olli



  • Also grundsätzlich würde ich da Abstände machen, dann kannst du ganz einfach mit dem >> Operator strings einlesen und dann konvertieren.
    Wenn es aber so ist, würde ich das in etwa so machen:

    #include <sstream>
    
    ..
    
    std::stringstream str;
    str << test[0] << test[1]
    int zahl = 0;
    
    str >> zahl;
    

    Davon gehe ich einfach mal aus, dass jedes Zeichen, dass du einliest 2 char beansprucht.



  • Hallo Olli,

    bau Dir erstmal kleine Helferleins zum Umrechnen von HexCode nach int und zum Einlesen einer Zahl bzw. eines Zeichens. Das Einlesen der von Dir angegebenen Zeile sieht dann so aus:

    #include <fstream>
    #include <cassert>
    #include <iostream>
    #include <iterator>     // ostream_iterator
    #include <string>
    #include <vector>
    
    int hex_code( char c )
    {
        if( c >= '0' && c <= '9' )
            return c - '0';
        if( c >= 'A' && c <= 'F' )
            return c - ('A' - 10);
        assert(("kein Hexcode", 0));
        return 0;
    }
    
    struct Char // ein zu lesendes Zeichen
    {
        explicit Char( char& c ) : m_c( c ) {}
        friend std::istream& operator>>( std::istream& in, const Char& c )
        {
            char c1, c2;
            if( in >> c1 >> c2 )
            {
                c.m_c = hex_code( c1 ) * 16 + hex_code( c2 );
            }
            return in;
        }
    private:
        char& m_c;
    };
    
    int main()
    {
        using namespace std;
        ifstream file( "input.txt" );
        string txt;     // der Text
        vector< int > zahlen; // und die Zahlen
        int i = 0;
        for( char c; file >> Char( c ); ++i )  // Lesen bis EOF
        {
            if( i < 8 )   // die ersten 8 Zeichen sollen Text sein
            {
                if( c != ' ' ) txt.push_back( c );
            }
            else
                zahlen.push_back( static_cast< unsigned char >( c ) );
        }
    
        cout << "Text: " << txt << endl;
        copy( zahlen.begin(), zahlen.end(), ostream_iterator< int >( cout << "> ", " " ) );
        cout << endl;
    
        return 0;
    }
    

    Wenn Du mehrere solcher Zeilen lesen willst, kommst es jetzt darauf an, wie eine Zeile genau formatiert ist.

    Sind immer die ersten 8 Zeichen die Zeichen eines Textes (exklusive der Spaces)? ist die Anzahl der Zahlen immer gleich (hier 17) oder dient das Zeilenende als Delimiter?

    Gruß
    Werner



  • Hallo Werner,

    vielen dank für deine Antwort( natürlich auch an drakon). Die Idee mit der Klasse ist Super. Ich war hier gedanklich voll auf dem falschen Dampfer.

    Noch mal vielen vielen DANK!

    Gruß
    Olli


Anmelden zum Antworten