Problem mit lseek (Gelöst)
-
Leider springt lseek nicht zur nächsten Position aber pread liest nichts ein.
Was mache ich falsch ?#include <iostream> #include <vector> #include <algorithm> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int main(){ int imgfile = open("myfile.txt", O_RDONLY | O_DIRECT); if(imgfile!=-1){ std::vector<char> input; int rlen=0; off_t pos=lseek(imgfile, 0, SEEK_SET); do{ char buffer[255]; rlen=pread(imgfile,buffer,255,pos); std::cout.write(buffer,rlen); pos=lseek(imgfile, 255, SEEK_CUR); std::copy(buffer,&buffer[rlen],std::back_inserter(input)); }while(rlen>0); close(imgfile); std::cout.write(input.data(),input.size()); } }
-
Er...pread liest von der absoluten angegebenen Position in der Datei und gibt den Offset zurück, an dem er landet (nicht die Anzahl der eingelesenen Zeichen). Da dürfte ziemlicher Unfug herauskommen. Wolltest du eigentlich read benutzen? Oder, wo du schon C++ benutzt, std::ifstream?
Was soll das Programm eigentlich machen?
-
Bilder einlesen ziemlich viele in ziemlich kurzer zeit, deshalb habe ich auf die Lowlevel API's zurück gegriffen.
Ah ok mein fehler habe gedacht das es den selben rückgabewert wie read hat, lediglich das der offset angeben werden muss welcher mit lseek um 255 bytes nach vorne verschoben wird.
-
Problem gelöst lag an O_DIRECT
#include <iostream> #include <vector> #include <algorithm> #include <unistd.h> #include <dirent.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int main(){ int imgfile = open("readme_linux_en_32bit.txt", O_RDONLY); if(imgfile!=-1){ std::vector<char> input; int buflen=255,rlen=1; for(off_t pos=lseek(imgfile, 0, SEEK_SET); rlen>0; pos=lseek(imgfile, buflen, SEEK_CUR)){ char buffer[buflen]; rlen=pread(imgfile,buffer,buflen,pos); std::copy(buffer,&buffer[rlen],std::back_inserter(input)); } close(imgfile); std::cout.write(input.data(),input.size()); } }