Как избавиться от ошибки сегментации? - PullRequest
0 голосов
/ 18 декабря 2018

Я давно этим занимаюсь, но не могу выяснить причину ошибки сегментации.

У меня такое ощущение, что что-то не так с записью в буфер несколько раз, но я не могузнать любые альтернативные методы.Или это может быть проблема с выделением памяти.

Вот код.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>


int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        fprintf(stderr, "Usage: ./recover filename\n");
        return 1;
    }

    FILE* file = fopen(argv[1], "r");

    if(!file)
    {
        fprintf(stderr, "No file found\n");
        return 2;
    }

    fseek(file, 0, SEEK_SET);

    unsigned char buffer[512];

    int counter = 0;

    char imagename[8];

    FILE* image;

    while(fread(buffer, 512, 1, file) == 1)
    {
        if(buffer[0] == 0xff &&
           buffer[1] == 0xd8 &&
           buffer[2] == 0xff &&
           (buffer[0] & 0xf0) == 0xe0 )
        {
             if(counter > 0)
             {
                fclose(image);
             }
             sprintf(imagename, "%03i.jpg", counter);

             image = fopen(imagename, "w");

             if(!image)
            {
                    fprintf(stderr, "No file found\n");
                    return 2;
            }

             fwrite(buffer, 512, 1, image);

             printf("%i", counter);
             counter++;

        }

        else if(counter > 0)
        {
            fwrite(buffer, 512, 1, image);
        }

    }
    fclose(image);
    fclose(file);
    free(image);
    return 0;
}

1 Ответ

0 голосов
/ 19 декабря 2018

Я не получаю никакой ошибки сегментации, но я думаю, что вы ошибаетесь в функции fread.

Возвращаемое значение Общее количество успешно прочитанных элементов возвращается как объект size_t, которыйинтегральный тип данных.Если это число отличается от параметра nmemb, то либо произошла ошибка, либо был достигнут конец файла.

Так что я не знаю, входили ли вы в цикл или ожидали чего-то другого.

Вы можете просто сделать: while(fread(buffer, 512, 1, file)).

...