c++ auf device dateien



  • Hallo,

    folgendes mini-programm in C, um auf den joystick zuzugreifen, funktioniert einwandfrei:

    #include <stdio.h>
    #include <linux/types.h>
    
    typedef struct js_event {
        __u32 time;     /* event timestamp in milliseconds */
        __s16 value;    /* value */
        __u8 type;      /* event type */
        __u8 number;    /* axis/button number */
    } __attribute__((packed)) js_event;
    
    int main()
    {
        const char* fname="/dev/input/js0";
        FILE* in=fopen(fname, "r");
        if(!in) {
            perror(fname);
            return -1;
        }
    
        js_event e;
        while(fread(&e, sizeof(e), 1, in))
            fprintf(stderr, "type: %i\n", e.type);
    }
    

    Jetzt dache ich mir, könnte ich das eigentlich auch in c++ machen:

    #include <iostream>
    #include <fstream>
    #include <linux/types.h>
    
    struct js_event {
        __u32 time;     /* event timestamp in milliseconds */
        __s16 value;    /* value */
        __u8 type;      /* event type */
        __u8 number;    /* axis/button number */
    } __attribute__((packed));
    
    using namespace std;
    int main()
    {
        const char* fname="/dev/input/js0";
        ifstream in(fname);
        if(!in) {
            perror(fname);
            return -1;
        }
    
        js_event e;
        while(in.read((char*)&e, sizeof(e)))
            cout<<"type: "<<e.type<<endl;
    }
    

    Doch in der C++ Version bleibt das Programm im read hängen, ich bekomme überhaupt keine Ausgabe.

    Woran könnte das liegen?
    Danke.



  • Vermutlich versucht ifstream die Datei zu buffern.



  • hm, wäre natürlich unpraktisch. Kann man das evtl. beeinflussen?

    Demnach könnte fstream das ja eigentlich, irgendwann vielleicht, genauso machen und der einzig korrekte Weg wäre direkt die lowlevel datei-funktionen zu benutzen.



  • du kannst dir deinen eigenen basic_streambuf implementieren.



  • nee danke, so wichtig ist mir das nicht 😉



  • Naja, wenn du dich auf die libstdc++ beschränken willst. Da ist bereits so ein streambuf implementiert

    stdio_filebuf



  • danke für den tip.


Anmelden zum Antworten