该程序的目标是从文件中恢复 JPG。
我已经在 CS50 在线类(class)中研究这个问题大约四五天了,我就是想不通。我继续遇到段错误,我不知道为什么。
我试过 debug50 并发现当程序尝试写入新文件时出现错误。为什么这样做我无法弄清楚。
在这个问题上我一直在用头撞墙,我已经完全删除并重写了多次。任何帮助将不胜感激。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "Usage ./recover file.type\n");
return 1;
}
char *infile = argv[1];
FILE *inptr = fopen(infile, "rb");
if (inptr == NULL)
{
fprintf(stderr, "Could not open file designated to be recovered\n");
fclose(inptr);
return 2;
}
int counter = 0;
FILE *img;
uint8_t buffer[512];
while (fread(buffer, sizeof(*buffer), 512, inptr))
{
if (buffer[0] == 0xff &&
buffer[1] == 0xd8 &&
buffer[2] == 0xff &&
(buffer[3] & 0xf0) == 0xe0)
{
if (counter > 0)
{
fclose(img);
}
char filename[8];
sprintf(filename, "%03i.jpg", counter);
img = fopen(filename, "w");
counter++;
}
if (counter !=0)
{
fwrite(buffer, sizeof(*buffer), 512, img);
}
}
fclose(img);
fclose(inptr);
return 0;
}
请您参考如下方法:
char filename[7];
sprintf(filename, "%03i.jpg", counter);
由于 NUL 终止符 \0
,七个字符的字符串占用 8 个字符。使数组更大,这样您就不会写到它的末尾。
if(img == NULL)
{
fprintf(stderr, "Could not create image file\n");
fclose(img);
return 3;
}
如果 img
没有打开,您不需要关闭它。另一方面,如果它确实打开了,那么您确实需要关闭它。将 fclose()
调用移动到循环的末尾。