首页 > 解决方案 > 在尝试编写将文件分解为多个 JPG 的程序时不断出现分段错误

问题描述

正如标题所说,我一直在尝试用 C 语言编写一个程序,将一个文件转换为多个 JPG 用于 CS 练习。我已经关闭并释放了我使用过的所有东西,但我仍然遇到分段错误,我不太清楚为什么。任何建议都会有很大帮助。

编辑我已经找到了答案,事实是第一个字节块可能没有标头,这使得程序进入“else”条件并将 512 字节的空内容写入不存在的文件中。解决方案是 else 变成 else if (block[0] != 0xff && block[1] != 0xd8 && block[2] != 0xff && (block[3] & 0xf0) != 0xe0 && filenumber != 0) 希望这可以帮助某人!

typedef uint8_t BYTE;

int main(int argc, char *argv[])
{
    // Checks for correct argv usage
    if (argc != 2)
    {
        printf("Usage: filter [file]\n");
        return 1;
    }

    FILE *f = fopen(argv[1], "r");
    if (f == NULL)
    {
    printf("Invalid file\n");
    return 1;
    }

    int filenumber = 0;
    BYTE *block = malloc(512 * sizeof(BYTE));

    char *filename = NULL;
    FILE *img = NULL;
    while (fread(&block, sizeof(BYTE), 512, f) == 512)
    {
        if (block[0] == 0xff && block[1] == 0xd8 && block[2] == 0xff && (block[3] & 0xf0) == 0xe0)
        {
             if (filenumber == 0)
             {
                filename = malloc(8);
                sprintf(filename, "%03i.jpg", filenumber);
                img = fopen(filename, "a");
                if (img == NULL)
                return 1;

                fwrite(&block, sizeof(BYTE), 512, img);
                filenumber++;
             }
             else
             {
                 fclose(img);
                 sprintf(filename, "%03i.jpg", filenumber);
                 img = fopen(filename, "a");

                 if (img == NULL)
                 return 1;

                 fwrite(&block, sizeof(BYTE), 512, img);
                 filenumber++;
             }
        }
        else
        {
            fwrite(&block, sizeof(BYTE), 512, img);
        }
    }

        fwrite(&block, sizeof(BYTE), fread(block, sizeof(BYTE), 512, f), img);
        free(filename);
        free(block);
        fclose(img);
        fclose(f);
        return 0;
}

标签: cpointerssegmentation-faultmalloc

解决方案


推荐阅读