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
-
danke für den tip.