PSET 4恢复分段故障CS50 [英] PSET 4 Recover SEGMENTATION FAULT CS50

查看:81
本文介绍了PSET 4恢复分段故障CS50的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在读取文件和写入文件方面有些挣扎。我已经在这个问题上解决了几天,但似乎还是无法解决。该程序应该从存储卡中恢复一些jpeg文件。使用以下代码,我不断遇到分段错误。你们能看到我哪里出问题了吗?这是我的以下代码:

I'm struggling a bit with reading files and writing into files. I've been working on this problem for a few days and I just can't seem to get it. The program is supposed to recover some jpeg files from a memory card. With the following code I keep getting a segmentation fault. Can you guys see where I went wrong? Here is my code below:

希望你们能提供帮助!

Hope you guys can help!

#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循环的第一次迭代结束时,您关闭 文件,然后 img 。这意味着这些指针的值变为 NULL 。在下一次迭代中,缓冲区正在从 NULL 指针读取(因为我们关闭了 file ,因此它什么也没有指向)。基本上,取消引用空指针会导致分段错误。

Problem

At the end of first iteration of while loop, you are closing file and img. This means the value of those pointers become NULL. In the next iteration, buffer is reading from a NULL pointer (because we closed file, it is pointing to nothing). Basically, dereferencing a null pointer results in segmentation fault.

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

If you move this piece of code outside of the while loop, it will work. (Tested with CS50 IDE)

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

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

This was a great practice for me to review what I did in CS50 - recover. :)

这篇关于PSET 4恢复分段故障CS50的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆