2016-06-07 2 views
1

Извините, если это форматирование беспорядочно, это мой первый опыт использования stackoverflow. Я пытаюсь использовать функцию fread для чтения в файл card.raw в блоках по 512 байт и сохранить первые 4 байта блока в s1-s4, а остальные 508 байт остались в массиве байтов. Однако, когда я пытаюсь запустить это, я получаю ошибку сегментации. Когда я попытался отлаживать, после вызова функции fread, argv, outptr, inptr и buf значения все становятся NULL. Почему это и что я делаю неправильно?Чтение данных из файла в структуру (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) 
     { 

Условный оператор используется для проверки, если первые 3 элемента buf содержат следующие шестнадцатеричные подписи. Я хотел использовать malloc в цикле, чтобы прочитать необработанный файл в структурах по 512 байт, решить, что делать с 512 байтами, а затем бесплатно освобождать его.

+0

Вы хотите прочитать данные в переменной 'buf' или в блок памяти, на который' buf' содержит указатель? – immibis

+1

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

+0

Прежде всего, добавьте проверку ошибок на 'fopen()' и 'Fread()'. При этом код не предпринимает никаких действий при проверке того, работал ли вообще файл. – alk

ответ

0

использование fread(buf, sizeof(BUFFER), 1, inptr); вместо fread(&buf, sizeof(BUFFER), 1, inptr); Также открыть файл в двоичном режиме для чтения т.е. "rb" вместо "r"

+0

Спасибо! Но зачем открыть файл в двоичном режиме? – alo129

+0

Некоторые системы могут обрабатывать режим «r» и «rb» 'по-разному. Например, конец строки можно обрабатывать по-разному. Ваши данные кажутся чистыми двоичными, если вы не хотите, чтобы эта система манипулировала им при чтении, поэтому безопасно открывать его в двоичном режиме. – Ashwani

0

При передаче &buf указатель вместо buf в функцию fread он запишет ваши данные не в выделенный буфер кучи, но и в вашем стеке функций. Так как стек на платформах x86 растет к более низким адресам памяти, это перезапишет все в стеке, которое было до вашей переменной buf - в вашем случае - локальные переменные, аргументы функции argc, argv и т. Д. И обратный адрес. Стек поврежден, и вы получаете ошибку сегментации.

Смежные вопросы