我恢复的图像在CS50 PSET4恢复中不匹配

问题描述

我正在尝试对CS50的pset4进行“恢复”问题。

尽管我的代码生成了全部50张图片,但是当我运行checkcs50时,还是有一个错误,第一张,中间和049张图片都不匹配。

要清楚,我能够检索000.jpg,然后立即检索文件002.jpg到0050.jpg。

谁能告诉我我在代码中做错了什么吗?提前非常感谢大家!

这是我的代码

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

bool magictag(int *);

int main(int argc,char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr,"Usage:./recover image\n");
        return 1;
    }
    FILE *memorycard = fopen(argv[1],"r");
    if (!memorycard)
    {
        fprintf(stderr,"File cannot be opened\n");
        return 2;
    }

    int file_no = 0;
    int b = 0;
    char a[1000];
    char z[1000];
    //While haven't reached EOF
    while (((b = fread(a,512,1,memorycard) != 0)))
    {
        //since fread moved the pointer 512 byte forward
        fseek(memorycard,-512,SEEK_CUR);
        //Check for JPEG Header
        uint8_t c[10];
        fread(c,4,memorycard);
        fseek(memorycard,-4,SEEK_CUR);
        if ((bool) magictag == true)
        {
            char buffer [50];
            sprintf(buffer,"%03i.jpg",file_no);
            //Open new JPEG file
            FILE *JPEG = fopen(buffer,"w");
            if (!JPEG)
            {
                fprintf(stderr,"jpg cannot be created\n");
                return 3;
            }
            char tmp1[1000];
            fread(tmp1,memorycard);
            fwrite(tmp1,JPEG);
            //copy till a new jpeg is encountered or end of file is reached
            int w = 0;
            char tmp2[1000];
            uint8_t d[10];
            while (((w = fread(z,memorycard) != 0)))
            {
                fseek(memorycard,SEEK_CUR);
                fread(d,memorycard);
                fseek(memorycard,SEEK_CUR);
                if (d[0] == 0xff && d[1] == 0xd8 && d[2] == 0xff && (d[3] & 0xf0) == 0xe0)
                {
                    break;
                }
                if (d[0] != 0xff || d[1] != 0xd8 || d[2] != 0xff || (d[3] & 0xf0) != 0xe0)
                {
                    fread(tmp2,memorycard);
                    fwrite(tmp2,JPEG);
                }
            }
            fclose(JPEG);
            file_no++;
        }
        else
        {
            fseek(memorycard,SEEK_CUR);
        }
    }
    fclose(memorycard);
}

bool magictag(int *c)
{
    if (c[0] == 0xff && c[1] == 0xd8 && c[2] == 0xff && (c[3] & 0xf0) != 0xe0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)