PSET 4 恢复分区故障 CS50

我在读文件和写进文件的问题上有点困难。几天来一直在解决这个问题,但似乎就是搞不定。这个程序应该是恢复存储卡中的一些jpeg文件。用下面的代码,我一直得到一个分段故障。你们能看出我哪里出错了吗?下面是我的代码。

希望你们能帮助我

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

int main(int argc, char *argv[])
{

    //Ensure only one command line argument//
    if (argc != 2)
    {
        printf("Usage: ./recover filename\n");
        return 1;
    }

    //Open File//
    FILE *file = fopen(argv[1], "r");
    if (file == NULL)
    {
        printf("File not working\n");
        return 1;
    }

    //Create buffer of size 512 bytes to store data from file that is being read//
    unsigned char buffer[512];
    //Set Bool value of already found first jpeg to false//
    bool already_found_jpeg = false; 
    //Create filename length of 8 that will be of new jpegs
    char filename[8];
    FILE *img = NULL;
    //num_of_imgs counter//
    int num_of_imgs = 0;
    while(fread(buffer, 512, 1, file) == 1)
    {
        //If start of new jpeg//
        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
        {
            //If first jpeg, start writing the very first file// 
            if (already_found_jpeg == false) 
            {
                sprintf(filename, "%03i.jpg", num_of_imgs);
                img = fopen(filename, "w");
                if (img == NULL)
                {
                    return 3;
                }
                //Write from buffer into new file//
                fwrite(&buffer, 512, 1, img);
                num_of_imgs ++;
                already_found_jpeg = true;
            }
            //Else if already found a jpeg meaning it's not the first jpeg then close file, so you can open up a new file that can be written too
            else if (already_found_jpeg == true)
            {
                fclose(img);
                sprintf(filename, "%03i.jpg", num_of_imgs);
                img = fopen(filename, "w");
                if (img == NULL)
                {
                    return 3;
                }
                //Write from buffer into new file//
                fwrite(&buffer, 512, 1, img);
                num_of_imgs ++;
            }
        }
        //else if not found the jpeg headers and already found first jpeg keep writing to file
        else 
        {
            if (already_found_jpeg == true)
            {
                fwrite(&buffer, 512, 1, img);
            }
        }
        //Close all files//
        fclose(file);
        fclose(img);
    }
}

解决方案:

遇到的问题

在第一次迭代的while循环结束时,你是 闭幕 fileimg. 这意味着这些指针的值变成了 NULL. 在下一个迭代中,缓冲区从一个 NULL 指针(因为我们关闭了 file,它指向的是无)。) 基本上,取消引用一个空指针会导致分段错误。

解决方法

如果你把这段代码移到while循环之外,它就会工作。(用CS50 IDE测试)

//Close all files//
fclose(file);
fclose(img);

这对我来说是一次很好的练习,让我复习了CS50中的内容–恢复:)。)

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何在出现异常后继续进行异步查找?

2022-9-9 0:22:41

未分类

我需要一些关于JS中Axios实验室的帮助。

2022-9-9 0:33:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索