Проблемы с чтением изображения в виде двоичного файла с помощью fread

#c #fread

#c #fread

Вопрос:

Я новичок в мире языка программирования C, и я пытался прочитать изображение как двоичный файл. К сожалению, когда я попытался прочитать файл, я получил неполную последовательность ("377330377", <incomplete sequence 340>) . Я уже пытался использовать fread, считывающий только размер байта, и теперь я пытаюсь использовать sizeof(unsigned char) , но я всегда получаю одну и ту же неполную последовательность. Вот часть кода:

 caratteri **createStruct(unsigned char c[], caratteri car[], caratteri *ptr[], long size) {

    for (long i = 0; i < size; i  ) {

        ptr[i] = amp;car[i];

        car[i].first = amp;c[i];

        car[i].last = amp;c[(size - 1   i) % size];
        car[i].index=i;
    }

    return ptr;
}

int compare(const void *a, const void *b) {

    caratteri *ca = *(caratteri **) a;

    caratteri *cb = *(caratteri **) b;

    unsigned char *c1;

    unsigned char *c2;

    c1 = ca->first;

    c2 = cb->first;

    while (*c1 - *c2 == 0) {

        c1  ;

        c2  ;
    }

    return (*c1 - *c2);
}

caratteri **bwt(long size, FILE *file) {

    FILE *risultato;
    
    unsigned char *c = malloc(sizeof(unsigned char) * size);
    
    fread(c, sizeof(unsigned char), size, file);

    caratteri *car = malloc(sizeof(caratteri) * size);

    caratteri **pCaratteri = malloc(sizeof(caratteri *) * size);

    pCaratteri = createStruct(c, car, pCaratteri, size);

    qsort(pCaratteri, size, sizeof(pCaratteri), compare);

    risultato=fopen("risultato","wb");

    for(long i = 0; i < size; i  )

        fputc(*pCaratteri[i]->last,risultato);

    fclose(risultato);

    return pCaratteri;
}
int main() {
    FILE *file;
    file = fopen("thumbnail.jpg","rb");
    if (file == NULL) {
        printf("Errore di apertura file!");
        exit(2);
    }
    fseek(file, SEEK_SET, SEEK_END);
    long size = ftell(file) 1;
    rewind(file);
    caratteri **car = bwt(size, file);
    FILE *risultato;
    decryptbwt(risultato);
    return 0;
}
 

Это не полный код, но мне нужна эта часть для правильной работы.
Кроме того, мне нужен этот код для работы со всеми типами файлов (.txt, .jpg, .png и т. Д.), И мне нужен символ в случае текстового файла, вот почему я использовал ftell(file) 1 , но я не уверен, что это уместно. В любом случае, как я могу прочитать файл в двоичном режиме, избегая проблемы неполных последовательностей?
Спасибо за ваши ответы и извините за глупый вопрос, но я новичок в этом мире.
Мне нужно взять дополнительный , потому что я использую алгоритм, которому требуется символ конца строки, вот почему я использую ftell с 1. Этот алгоритм должен работать с файлами любого типа, поэтому мне нужно правильно его прочитать, а затем использовать преобразование Берроуза Уилера, чтобы отсортировать файл, который мне нужно сжать. Кроме того, я не уверен, что мне нужно использовать fseek таким образом, но я думаю, что другого способа получить размер файла нет.

Комментарии:

1. Не существует такого понятия, как «неполные последовательности». Если это двоичный файл, то вам необходимо знать структуру файла, чтобы правильно его прочитать, иначе вы, вероятно, не сможете правильно интерпретировать содержимое (если только вы не заботитесь о содержимом). Возможно, вы захотите начать с магических чисел ( en.wikipedia.org/wiki/List_of_file_signatures ).

2. Дрянной отладчик, он считает, что отображение двоичных данных в виде строки в кодировке utf8 — хорошая идея. Это не так, поиск недопустимых последовательностей utf8 практически гарантирован. Расскажите нам, что вы используете, чтобы мы все могли этого избежать.

3. Каково предполагаемое использование этого дополнительного байта? Если вы хотите завершить строку в случае текстового файла, вам нужно добавить 0 байт после чтения. Вы не получите его из файла. Но какой смысл записывать 0 в текстовый файл?

4. вы уверены, что хотите искать именно так fseek(file, SEEK_SET, SEEK_END); ?

5. Новый файл должен быть копией предыдущего. Если это не так, все действительно странно. Но в чем именно ваша проблема: текстовый редактор не может отображать изображение в формате jpg? Это не его работа…