从原始数据文件中提取JPEG的程序会产生分割错误(在C中)



我是编写读取或写入文件的程序的新手,我完全被我不断遇到分段错误的原因所困扰。我觉得这可能与我的一个文件指针或新创建的文件有关,但更有经验的眼睛的任何帮助将不胜感激!

另一条信息 - 当我尝试调试程序时,它似乎卡在第 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 inputFilen");
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);
}

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

最新更新