Ich antworte direkt mal auf den OP, hier kam ja teilweise echt komische sSachen.
alexander_ro hat geschrieben: 11.12.2018 11:11:13
Ich suche jetzt nach einer Möglichkeit die Daten effizient in einen C++ Container zu bekommen. Der std::vector würde sich dafür gut eignen ich habe da ein Beispiel im Netz gefunden das aber meiner Meinung nicht ganz richtig ist. Das sah so aus:
Code: Alles auswählen
std::vector Puffer;
read (iIntDevFile, &Puffer[0], iLaenge);
Wenn man aber bei einem vector den Pointer benutzt wird doch kein Speicher für die zu speichernden Daten reserviert.
Du hast recht, so wird kein Speicher allokiert und der vector nicht auf die richtige Größe gesetzt. Das hat aber mit dem Pointer nichts zu tun. Diese Notation hat man vor C++11 benutzt, da gab es schlich die data() Memberfunktion noch nicht.
alexander_ro hat geschrieben: 11.12.2018 11:11:13
Meine Lösung jetzt sieht etwas anders aus Funktioniert aber leider auch nicht ganz richtig:
Code: Alles auswählen
std::vector<char> vecDaten;
vecDaten.reserve (2);
read (iIntDevFile, vecDaten.data (), 2);
So hat man zwar die zwei Byte tatsächlich dann im vector gespeichert. Leider liefert die Funktion:
Wie die anderen schon angemerkt hatten, fehlt hier nur noch das resize() des vectors.
Code: Alles auswählen
std::vector<char> vecDaten;
vecDaten.reserve (2);
auto size = read (iIntDevFile, vecDaten.data (), 2);
vecDateb.resize(size);
Aber, wie es halt immer ist, der Teufel steckt halt im Detail. Der erste Satz in der manpage von read() lautet:
read() attempts to read up to count bytes
Das heißt, mal abgesehehn vom einen echt Fehlerfall, kann read() auch jederzeit abbrechen bevor alle Daten aus der Datei gelesen wurden, oder bevor die Anzahl an angefragten Bytes gelesen wurden. Außerdem würde man aus Effizienzgründen nicht nur zwei Bytes lesen wollen.
Eine richtige Lösung würde mittels reserve() einen hinreichend großen Puffer anlegen, read() in einer Schleife ausführen und den Rückgabewert überprüfen. Sind alle Daten gelesen wurden oder EOF erreicht, kann die Schleife verlassen werden. Womöglich hat man nun zuviele Bytes gelesen, nicht nur dass man dann den vector wieder verkleinern muss, hat man zusätzlich das Problem, was tun mit den angefangenen Bytes vom nächsten logischen Lesevorgang? Im Fehlerfall sollte man damit auch umgehen. Und dann werden aus den zwei Zeilen Code ganz schnell 200 und man fragt sich, ob ioctl diese ganzen Mühen wert war.