PSET 4恢复分段错误CS50

时间:2020-03-30 02:29:58

标签: c segmentation-fault 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);
    }
}

1 个答案:

答案 0 :(得分:0)

问题

在while循环的第一次迭代结束时,您正在关闭 fileimg。这意味着这些指针的值变为 NULL 。在下一次迭代中,缓冲区正在从 NULL 指针读取(因为我们关闭了file,所以它什么也没有指向)。基本上,取消引用空指针会导致分段错误。

解决方案

如果将这段代码移到while循环之外,它将起作用。 (已通过CS50 IDE测试)

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

对于我来说,这是对我在CS50中所做的工作进行回顾的好习惯-恢复。 :)