2016-06-07 8 views
1

Sorry, wenn diese Formatierung unordentlich ist, verwende ich Stackoverflow zum ersten Mal. Ich versuche, die fread Funktion zu verwenden, um in die card.raw Datei in Blöcken von 512 Bytes einzulesen und die ersten 4 Bytes des Blocks in s1-s4 und die anderen 508 Bytes zu speichern, die im Array von Bytes übrig sind. Wenn ich jedoch versuche, dies auszuführen, erhalte ich einen Segmentierungsfehler. Wenn ich das Debugging probierte, nachdem die fread-Funktion aufgerufen wurde, argv, outptr, inptr und buf Werte werden alle NULL. Warum ist das und was mache ich falsch?Lesen von Daten aus einer Datei in eine Struktur (C)

typedef uint8_t BYTE; 

//block of 512 bytes 
typedef struct 
{ 
    BYTE s1; 
    BYTE s2; 
    BYTE s3; 
    BYTE s4; 
    BYTE image[508]; 
} 
BUFFER; 

int main(int argc, char* argv[]) 
{ 
    //opens memory card file 
    FILE* inptr = fopen("card.raw", "r"); 

    int jpgcounter = 0; 

    //creates jpg file 
    char title[7]; 
    sprintf(title, "%d.jpg", jpgcounter); 
    FILE* outptr = fopen(title, "a"); 

    //create buf (pointer) of type BUFFER 
    BUFFER* buf; 

    do 
    { 
     //creates buffer structure for storage of 512B blocks 
     buf = malloc(sizeof(BUFFER)); 

     //read 512 bytes at a time & stores every 512B block into a buffer struct buf 
     fread(&buf, sizeof(BUFFER), 1, inptr); 

     if(buf->s1 == 0xff && buf->s2 == 0xd8 && buf->s3 == 0xff) 
     { 

Die if-Anweisung verwendet wird, zu überprüfen, ob die ersten drei Elemente buf die folgenden hexadezimalen Signaturen enthalten. Ich wollte malloc in einer Schleife verwenden, um die Raw-Datei in Structs von 512 Bytes zu lesen, zu entscheiden, was mit den 512 Bytes zu tun ist, und dann kontinuierlich freizugeben.

+0

Möchten Sie die Daten in die Variable 'buf' oder in den Speicherblock, in dem' buf' einen Zeiger enthält, einlesen? – immibis

+1

'fred (& buf, sizeof (PUFFER), 1, inptr);' -> 'fread (buf, sizeof (BUFFER), 1, inptr);' – kaylum

+0

1. Fügen Sie die Fehlerüberprüfung zu 'fopen()' und hinzu 'fread()'. So wie es steht, unternimmt der Code keine Aktionen, um zu testen, ob der Zugriff auf die Datei überhaupt funktioniert. – alk

Antwort

0

Verwendung fread(buf, sizeof(BUFFER), 1, inptr); statt fread(&buf, sizeof(BUFFER), 1, inptr); Auch offene Datei im Binärmodus dh "rb" statt "r"

+0

Danke! Warum aber die Datei im Binärmodus genau öffnen? – alo129

+0

Manche Systeme können den Modus "r" und "rb" anders behandeln. Zum Beispiel könnte die Zeilenendung anders gehandhabt werden. Ihre Daten scheinen rein binär zu sein, wo Sie nicht möchten, dass das System es beim Lesen manipuliert, daher ist es sicher, es im Binärmodus zu öffnen. – Ashwani

0

zu lesen Wenn Sie &buf Zeiger statt buf in die fread Funktion übergeben sie Ihre Daten nicht in dem zugewiesenen Heap-Puffer schreiben, aber auf deinem Funktionsstapel. Da Stack auf x86 Plattformen in Richtung der unteren Speicheradressen wächst, überschreibt dies alles auf dem Stapel, der vor Ihrer buf Variable war - in Ihrem Fall eine lokale Variablen, Funktion Argumente argc, argv, etc und Absenderadresse. Stack wurde beschädigt und Sie erhalten einen Segmentierungsfehler.