read: Linux -> Windows
-
Hallo zusammen,
ich habe folgenden Code unter Visual Studio:
int ReadPacket(FILE *p_fd, uint8_t* p_dst ){ int i = 187; int i_rc = 1; p_dst[0] = 0; while((p_dst[0] != 0x47) && (i_rc > 0)){ i_rc = read(p_fd, p_dst, 1); } [...]
der read Aufruf wirft eine Debug Assertion (Express: fh >= 0 && (unsigned) fh < (unsigned)_nhandle). Jemand ein Tip was ich da falsch mache? Muß ich das read gegen eine ander Funktion ersetzen? Der Code ist ein Auszug aus dem libdvbpsi Beispiel von der VLC Bibliothek, welche ich unter Windows zum laufen bringen möchte. Die Beispiele stammen von Debian.
Danke schon mal.
uwe
-
FILE* und read beißt sich
-
wenn die datei mit open() geöffnet wird, bekommst du einen filedeskriptor vom typ int. den kannst du für read() verwenden. FILE* wird von fopen() zurückgegeben, diesen pointer kannst du mit fread() verwenden. um einen gültigen dateideskriptor von einem streampointer zu erhalten, kannst du folgenes makro verwenden:
int fd = fileno(p_fd);
ich bin mir aber nicht sicher ob es das auch unter windows gibt.
edit: oh jetzt hab ich mich selbst zitiert *schäm*
-
hi,
also erst einmal dank. nun sehe ich das es zwar fileno gibt (heißt genauer gesagt _fileno), aber nun kennt er read plötzlich nicht mehr. vorhin kannte er es noch. schweinebacke. ok, liegt dann wohl an der unistd.h. was muß ich den beachten wenn ich aus read nen fread mache? wo ist da der unterschied? mal für dummies: stream? und weiter?
danke auf jeden fall.
uwe
-
uwerothfeld schrieb:
hi,
also erst einmal dank. nun sehe ich das es zwar fileno gibt (heißt genauer gesagt _fileno), aber nun kennt er read plötzlich nicht mehr. vorhin kannte er es noch. schweinebacke. ok, liegt dann wohl an der unistd.h. was muß ich den beachten wenn ich aus read nen fread mache? wo ist da der unterschied? mal für dummies: stream? und weiter?
danke auf jeden fall.
uwe
grundsätzlich ändert sich an der funktionalität nüx. nur fangen alle prototypen mit f an, also fopen, fread, fwrite, fseek, fclose (mit entprechend anderen parametern, siehe msdn oder manpage). der vorteil gegen über den lowlevel varianten open, read, write lseek und close ist erstmal das es auch unter windows ohne hässliche warnungen kompilierbar ist. die fehlerbehandlung ist auch etwas komfortabler mit ferror() gelöst. fileno() solltest du wirklich nur da einsetzen, wo's nötig ist. zum beispiel wenn du die datei mit mmap() memory-mappen willst
-
ha,
cool. Dann letzte Frage: fread will ja als Parameter:
ptr - ziel pointer size - size in bytes, der elemente die gelesen werden count - anzahl elemente zum lesen stream - quellpointer
das ganze will ich ja nun in ein uint8_t* feld p_dst schreiben, was gebe ich dann als size an? sizeof(uint8_t)?
gruß
uwe
-
nein, sizeof(uint8_t), wird 1 zurückgeben, und das willst du ja wohl nicht haben, es sei denn du willst wirklich nur ein byte lesen :). size ist die größe des blocks in bytes die von der datei gelesen werden soll. count die anzahl solcher blocks. wenn size also 1024 und count 4 ist, dann werden 1024 bytes in 4 'durchgängen' also insgesamt 4096 in deinen zielpuffer geschrieben
-
hi sothis_,
vielen dank. hast mir sehr geholfen
uwe