首页 > 解决方案 > 使用 fread 将图像作为二进制文件读取时出现问题

问题描述

我是 C 编程语言领域的新手,我试图将图像读取为二进制文件。不幸的是,当我尝试读取文件时,我得到了一个不完整的序列("\377\330\377", <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] = &car[i];

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

        car[i].last = &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 等),如果是 txt 文件,我需要 \0 字符,这就是我使用的原因ftell(file)+1但我不确定这是否合适。无论如何,如何以二进制模式读取文件以避免序列不完整的问题?谢谢你的回答,很抱歉这个愚蠢的问题,但我是这个世界的新手。我需要额外的 \0 因为我使用的算法需要字符串字符的结尾,这就是我使用 ftell 和 +1 的原因。这个算法应该适用于每一种文件,所以我需要正确读取它,然后使用 burrows Wheeler 变换来对我需要压缩的文件进行排序。另外,我不确定是否必须以这种方式使用 fseek,但我认为没有其他方法可以获取文件的大小。

标签: cfread

解决方案


推荐阅读