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

问题描述 投票:0回答:1

我目前正在使用 cs50 中的“恢复”pset,并且我已经尝试了解决方案的多种变体。任务是恢复从存储卡中删除的 50 个 JPEG 文件。我们被指示检查 fread 的每个 512 字节通道的前 4 个字节,以指示 JPEG 文件的开始并将其写入新文件。一旦达到另外 4 个匹配的字节,我们就应该关闭前一个文件并写入一个新文件,直到达到 EOF(存储卡中的数据在名为 card.raw 的文件中提供给我们)。

以下是我当前的解决方案。我的困惑是,如上所述,我在运行程序时能够生成 50 个 JPEG。但是,当我打开任何新文件时,我在 VS Code 中遇到了错误,我将其包含在我的代码下面。任何帮助将不胜感激 - `

#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 中打开它们时,出现以下错误:

加载webview时出错:错误:无法注册服务工作者:NotSupportedError:无法注册范围的ServiceWorker('https://0foennjt10in3q0224oduooshmepdo2jsp1eg131ejbmkj7a2i7k.vscode-cdn.net/stable/8fa188b2b301d36553cbc9ce1b0a146 ccb93351f/out/vs/workbench/contrib/webview/ browser/pre/') 与脚本 ('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 的权限..

我非常感谢这里的任何帮助。我是初学者,很可能我犯了一个我没有看到的小错误。也有可能我的做法完全错误,需要重新开始。我只是不知道接下来该去哪里,因为我觉得我已经尝试了目前能想到的一切。

c cs50 data-recovery recover
1个回答
0
投票

提供的代码有几个问题:

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;
}

我合并了错误检查并通过删除冗余来简化代码。

© www.soinside.com 2019 - 2024. All rights reserved.