【问题标题】:program to extract JPEGs from raw data file creates segmentation fault (in C) [closed]从原始数据文件中提取 JPEG 的程序会产生分段错误(在 C 中)[关闭]
【发布时间】:2018-06-08 07:26:30
【问题描述】:

我是编写读取或写入文件的程序的新手,我完全不知道我不断收到分段错误的原因。我觉得这可能与我的文件指针或新创建的文件之一有关,但如果有经验的眼睛提供任何帮助,我们将不胜感激!

另一条信息 - 当我试图调试程序时,它似乎卡在检查第 35 行周围的 if 语句的时间比我预期的要长,然后最终 - 分段错误。

下面是我的完整代码:

    // program to recover deleted JPEGs from memory card

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

int main(int argc, char *argv[])
{
    // ensure proper usage
    if (argc != 2)
    {
        fprintf(stderr, "Usage: recover inputFile\n");
        return 1;
    }
    // remember filename
    char *infile = argv[1];

    // open input file
    FILE *inptr = fopen(infile, "r");
    if (inptr == NULL)
    {
        fprintf(stderr, "Could not open %s.\n", infile);
        return 2;
    }

// read raw input file
    int buffer[512];
    int counter = 0;
    char filename[8];
    FILE* img;

    // repeat until EOF
    while (fread (&buffer, 1, 512, inptr) == 512)
    {
        //fread (&buffer, 1, 512, inptr);  // this might be redundant (while statement)
    // check for start of JPEG
        if (buffer[0] == 0xff &&
            buffer[1] == 0xd8 &&
            buffer[2] == 0xff &&
            (buffer[3] & 0xf0) == 0xe0)
        {
            if (counter > 0) // if this is not the first jpeg found, we need to close previous jpeg
            {
                fclose(img);
            }
            // create and open file
            sprintf(filename, "%03i.jpg", counter);
            counter ++; //keep track of current jpeg count

            img = fopen(filename, "w");
            // make sure our pointer wasn't NULL
            if (img == NULL)
            {
                fprintf(stderr, "Could not open %s.\n", filename);
                return 2;
            }
            do
            {
            // Write current buffer to JPEG
            fwrite (&buffer, 512, 1, img);
            fread (&buffer, 1, 512, inptr);
            }
            // making sure to stop at start of new JPEG
            while ((buffer[0] == 0xff &&
                    buffer[1] == 0xd8 &&
                    buffer[2] == 0xff &&
                    (buffer[3] & 0xf0) == 0xe0) == 0);
            // move cursor back one 512 byte block so it can be re-read for if-statement
            fseek (inptr, -512, SEEK_CUR);
        }
    }
    // close remaining open files
    fclose(img);
    fclose(inptr);
}

【问题讨论】:

  • fread (&amp;buffer, -> fread (buffer,
  • 另外你不会读到ints,而是字符,这些应该是unsigned。同样的任务被问了很多,所以你可以用谷歌搜索
  • 无论如何,使用调试器定位分段错误你的任务。
  • 另外,您应该 fseek 返回您使用之前的 fread 调用而不是 512 实际读取的字节数。
  • @Jabberwocky,没关系,在这两种情况下fread都会得到void*指向同一个内存地址的指针

标签: c io segmentation-fault cs50


【解决方案1】:

当它试图关闭从未打开的 img 文件时,分段错误最终出现在程序的末尾。使用 int 而不是 unsigned char 会导致 if 语句比较失败。

【讨论】:

    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多