无法找出解决方案,以cs50的“恢复”在C.新的JPEG正在创建,但我不能查看它们-

bvjveswy  于 2023-11-16  发布在  其他
关注(0)|答案(1)|浏览(91)

我目前在cs50中的“Recover”pset上,我已经尝试了我的解决方案的多种变体。任务是恢复从存储卡中删除的50个JPEG文件。我们被指示检查每个512字节的fread传递的前4个字节,以指示JPEG文件的开始并将其写入新文件。一旦它达到另一个4字节匹配,我们应该关闭前一个文件并写入一个新的文件,直到达到1000(来自存储卡的数据在一个名为card.raw的文件中提供给我们)。
下面是我目前的解决方案。我的困惑是,我能够在运行我的程序时产生正好50个JPEGS,如上所述。然而,当我去打开任何新文件时,我遇到了VS代码中的错误,我将在我的代码下面包括。任何帮助都将在这里表示感谢- `

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

typedef uint8_t BYTE;

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

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

    if (forensic == NULL)
    {
        printf("File was not found\n");
        return 1;
    }

    FILE *currentFile;
    currentFile = NULL;
    int jpegCount = 1;
    char *filename = NULL;
    filename = malloc(8 * sizeof(char));

    BYTE buffer[512];
    while (fread(buffer, sizeof(char), 512, forensic) != 0)
    {
        // Check for matching 4 bytes, indicating start of a new JPEG
        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
        {
            // If file exists, close it and start a new one
            if (currentFile != NULL)
            {
                fclose(currentFile);
                sprintf(filename, "%03i.jpg", jpegCount);
                currentFile = fopen(filename, "w");
                jpegCount++;
            }
            // If no file exists yet, create one
            else
            {
                sprintf(filename, "%03i.jpg", jpegCount);
                currentFile = fopen(filename, "w");
                jpegCount++;
            }
        }
        // If file exists, write to it
        if (currentFile != NULL)
        {
            BYTE wBuffer[512];
            fwrite(wBuffer, sizeof(BYTE), 512, currentFile);
        }
    }
    fclose(currentFile);
    fclose(forensic);
    free(filename);
    return 0;
}

字符串
再次,我的程序成功地产生了50个新的JPEG,但当我试图在VS Code中打开它们时,我得到了以下错误:
加载Web视图时出错:错误代码:无法注册服务工作者:NotSupportedError:无法为范围注册ServiceWorker('https://0foennjt10in3q0224oduooshmepdo2jsp1eg131ejbmkj7a2i7k.vscode-cdn.net/stable/8fa188b2b301d36553cbc9ce1b0a146ccb93351f/out/vs/workbench/contrib/webview/browser/pre/')with script('https://0foennjt10in3q0224oduooshmepdo2jsp1eg131ejbmkj7a2i7k.vscode-cdn.net/stable/8fa188b2b301d36553cbc9ce1b0a146ccb93351f/out/vs/workbench/contrib/webview/browser/pre/service-worker.js?v=4&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&remoteAuthority=codespaces+sebdoubleu-code50-111027905-wpxr5g54pv9h9667'):用户拒绝了使用Service Worker的权限。
我真的很感激这里的任何帮助。我是一个初学者,很可能我犯了一个我没有看到的小错误。也有可能我完全错了,需要重新开始。我只是不知道从哪里开始,因为我觉得我已经尝试了我能想到的一切。

iqxoj9l9

iqxoj9l91#

提供的代码存在几个问题:
声明了wBuffer,但在写入之前没有初始化或填充任何数据。由于您已经用要写入的内容填充了缓冲区,因此不需要此缓冲区。jpegCount变量的增量应从0开始,不是1。这将确保第一个文件名为000.jpg。当创建或打开新的JPEG文件时,您不会检查fopen函数的结果。确保您不会处理NULL指针。下面是更正后的代码:

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

typedef uint8_t BYTE;

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

    FILE *forensic = fopen(argv[1], "r");
    if (forensic == NULL)
    {
        printf("File was not found\n");
        return 1;
    }

    FILE *currentFile = NULL;
    int jpegCount = 0; // Start counting from 0
    char *filename = malloc(8 * sizeof(char));
    if (filename == NULL)
    {
        fclose(forensic);
        printf("Memory allocation error\n");
        return 1;
    }

    BYTE buffer[512];
    while (fread(buffer, sizeof(BYTE), 512, forensic) == 512) // Using sizeof(BYTE) for clarity
    {
        // Check for matching 4 bytes, indicating start of a new JPEG
        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
        {
            // If file exists, close it before starting a new one
            if (currentFile != NULL)
            {
                fclose(currentFile);
            }

            sprintf(filename, "%03i.jpg", jpegCount);
            currentFile = fopen(filename, "w");

            if (currentFile == NULL)
            {
                free(filename);
                fclose(forensic);
                printf("Error creating file\n");
                return 1;
            }

            jpegCount++;
        }

        // If file exists, write to it
        if (currentFile != NULL)
        {
            fwrite(buffer, sizeof(BYTE), 512, currentFile); // Write using the original buffer
        }
    }

    // Close any open files
    if (currentFile != NULL)
    {
        fclose(currentFile);
    }

    fclose(forensic);
    free(filename);

    return 0;
}

字符串
我已经加入了错误检查,并通过删除冗余来简化代码。

相关问题