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

查看:14
本文介绍了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:

希望大家帮忙!

#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
");
        return 1;
    }

    //Open File//
    FILE *file = fopen(argv[1], "r");
    if (file == NULL)
    {
        printf("File not working
");
        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,它没有指向任何内容).基本上,取消引用空指针会导致分段错误.

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天全站免登陆