c - read () syscall på windows undlader at læse binær fil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne læse billedfilen for at holde dem i hukommelsen, før de bruges med SDL. Jeg indså bare, at åbne () og læs () på Windows undlader at læse min fil helt, men på Linux/BSD virker det!


Dette er min kode:


#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

#define IMGPATH "rabbit.png"

int
main(int argc, char *argv[])
{
    int fd;
    struct stat st;
    void *data;
    size\_t nbread;

    fd = open(IMGPATH, O\_RDONLY);
    if (fd < 0)
        exit(1);

    fstat(fd, &st);

    data = malloc(st.st\_size);
    if (data == NULL)
        exit(1);

    nbread = read(fd, data, st.st\_size);
    if (nbread != st.st\_size)
        printf("Failed to read completely: expected = \%ld, read = \%ld
", st.st\_size, nbread);
}


På vinduer vil det producere: Kunne ikke læses helt: forventet=19281, læs=5. perror () siger ingen fejl, og hvis jeg forsøger at læse () igen, ændrer den sig ikke og sidder fast ved denne 5 byte.


Er der noget flag, jeg skal tilføje for at åbne () for at læse binær fil?


Dette er den første PNG-bytes-fil, jeg forsøger at læse:


0000000 211   P   N   G  
  
 032  
        
   I   H   D   R
0000010                  k   006         <FA> 220   <E5>


Stopper det at læse, når '\ n' vises?


Jeg ved ikke, hvordan man løser dette lige nu.


PS: Venligst siger ikke 'brug libpng', fordi jeg bare skal hente filbufferen i hukommelsen, før du bruger den med SDL og mit grafiske bibliotek.

Bedste reference


Et par punkter:



  1. read() er ikke garanteret at læse antallet af byte specificeret. Det kan vende tilbage tidligt eller intet overhovedet. Det er normalt at kalde read() flere gange for at fylde store buffere. Dette er en af ​​grundene til, at stdio wrappers og fread() er nyttige. [15] [16]

  2. I Windows er tekst og binær tilstand forskellige. Da du ikke angav O\_BINARY i dine flag, håndterer Windows ' ' tegn for denne fil. Sandsynligvis vender den tilbage til den første ' ' der opstår.

  3. Det er ikke nødvendigt at kontrollere filstørrelsen, før du læser filen. read() og faktisk en indpakning omkring read() vil altid stoppe læsning i slutningen af ​​filen.



Update0



Ved yderligere observation ser jeg, at 5. og 6. tegn er , dette håndteres specielt af Windows, når det er i tekst-tilstand, og forklarer den tidlige tilbagevenden som jeg nævnte ovenfor. Hvis du ikke sender O\_BINARY til open() opkaldet, konverteres disse 2 tegn til en enkelt .