Bestimmte Zahl aus Datei auslesen



  • Hallo,

    ich habe eine vom System generierte Datei:

    86 01 4b 46 7f ff 0a 10 5e : crc=5e YES
    86 01 4b 46 7f ff 0a 10 5e t=24375
    

    Ich möchte gerne in der zweiten Zeile den Wert hinter t= auslesen und in einem double Wert speichern. Optional würde ich gerne gerne überprüfen, ob in der ersten Zeile das YES am Ende der Zeile vorhanden ist (Checksum).

    Ich habe das mit einer while-Schleife bisher ausprobiert, jedoch erhielt ich nie den Wert, den ich haben wollte 😕

    Kann mir jemand bitte mal auf die Sprünge helfen, was ich verbessern sollte?

    Das ist mein Code:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <stdlib.h>
    using namespace std;
    
    /* Entry Point */
    int main (int argc, char **argv)
    {
        ifstream datei;
        int temperatur;
        float variable1;
        string text;
        int abort = 0;
    
        while ((abort != 1))
        {
            datei.open("/sys/bus/w1/devices/28-00000318f75d/w1_slave", ios::in);
            if ((datei.fail()))
            {
                cout << "Konnte datei nicht öffnen!";
    
                /* Man könnte hier auch break nehmen um die schleife abzubrechen. */
                /* break; */
                return 0;
            }
    
            datei.seekg (0, datei.beg);
    
            getline(datei, text);
    
            temperatur = atoi(text.c_str());
    
            variable1 = ((float)temperatur) / 1000.0f;
    
            /* Wenn er hier keine nach Komma stellen anzeigt, versucht */
            /* printf("%f\n", variable1); */
    
            cout << variable1 << "\n";
    
            datei.close();
    
            sleep(1);
        }
    
        /* Mit break geht es hier weiter mit der ausführung. */
    
        //::getchar();
    
        return 0;
    }
    


  • Dann beschreibe mal, was das vorhandene Programm deiner Meinung nach macht.



  • Meine Kommentare zum Code:

    julianpe schrieb:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <stdlib.h> // ???
    using namespace std;
    
    int main (int argc, char **argv)
    {
    	// Wir sind hier nicht in C sondern in C++, daher alles so spät / lokal wie möglich definieren
        ifstream datei;
        int temperatur;
        float variable1;
        string text;
        int abort = 0; // Suchst du bool?
    
        while ((abort != 1))
        {
    		// 1. Das gehört in den Konstruktor
    		// 2. ios::in ist bei ifstreams schon implizit gesetzt
            datei.open("/sys/bus/w1/devices/28-00000318f75d/w1_slave", ios::in);
            if ((datei.fail()))
            {
                cout << "Konnte datei nicht öffnen!";
                return 0;
            }
    
    		// Leseposition um 0 verschieben? Sinn?
            datei.seekg (0, datei.beg);
    
            getline(datei, text);
    		
    		// In C++ kann man auch direkt von Streams in ints etc. einlesen
            temperatur = atoi(text.c_str());
    
    		// Den hässlichen C-Cast kannst du dir sparen da 1000.f schon float ist -> Promotion
            variable1 = ((float)temperatur) / 1000.0f;
    
            cout << variable1 << "\n";
    
    		// Würdest du dir auch sparen wenn datei lokal definiert wäre dank Destruktor und sexy RAII
            datei.close();
    
    		// Wozu?
            sleep(1);
        }
    
    	// Wozu?
        return 0;
    }
    

    Und wie manni66 sagte:
    Wo ist der Code, der das YES und die Zahl nach t= ausliest?



  • Hallo julianpe,

    Willkommen im C++-Forum.

    Zu Deinem Problem: Nutze die Möglichkeiten von istream::ignore; so kannst Du alles überlesen, bis Du auf ein bestimmtes Zeichen triffst.

    Beispiel:

    #include <fstream> // ifstream
    #include <iostream>  // cout, cerr
    #include <limits>  // numeric_limits<>
    #include <string>
    
    int main() 
    {
        using namespace std;
        ifstream datei("/sys/bus/w1/devices/28-00000318f75d/w1_slave");
        if( !datei.is_open() )
        {
            cerr << "Fehler beim Oeffnen der Datei" << endl;
            return -2;
        }
    
        const streamsize ALLES = numeric_limits< streamsize >::max();
        string word;
        datei.ignore( ALLES, '=' ) >> word; // z.B. "... crc=5e"
        if( datei >> word ) // YES
        {
            if( word == "YES" )
                cout << "Checksumme Ok" << endl;
        }
        float variable_t;
        if( datei.ignore( ALLES, '=' ) >> variable_t )
        {
            cout << "t=" << variable_t << endl;
        }
        return  0;
    }
    

    .. noch ein paar Fragen zum Format:
    wenn kein 'YES' da steht, was steht dann da?
    kann außer 't=..' am Ende der zweiten Zeile noch etwas anderes ähnliches stehen (z.B. a=..)?
    Ist die Anzahl der Hex-Codes immner konstant ==9 (bzw. =8+crc)?

    Gruß
    Werner



  • Ich habe meine Bedingungen noch nicht implementiert. Ich wollte das Skript als Vorlage nehmen und wusste nicht wie ich die Bedingungen einbaue.

    . noch ein paar Fragen zum Format:
    wenn kein 'YES' da steht, was steht dann da?
    kann außer 't=..' am Ende der zweiten Zeile noch etwas anderes ähnliches stehen (z.B. a=..)?
    Ist die Anzahl der Hex-Codes immner konstant ==9 (bzw. =8+crc)?

    Wenn YES nicht dort steht, dann steht dort NO.
    Und das t= steht dort immer. Die Anzahl der Hexcodes ist auch konstant.

    Danke im Voraus
    Gruß
    Julian


Log in to reply