所以我正在做第 4 周的 CS50 练习题。它是关于恢复已删除的 JPEG 文件,因此您输入文件检查 4 个标头(前 3 个相同,第 4 个可能有所不同,但他们给了您一个解决方案)但是该程序给了我一个分段错误,我花了很多时间调试但仍然无法弄清楚。我是新人,非常感谢任何帮助
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t BYTE;
int main(int argc, char *argv[])
{
//check for 2 command-line arguments
if (argc != 2)
{
printf("Input one command-line argument\n");
return 1;
}
FILE *f = fopen(argv[1], "r");
//the first 4 bytes which are the headers
BYTE b[4];
int filecounter = 0;
//a line to check that I'm still not at the end of the file
while (fread(&b, sizeof(b), sizeof(b), f) == sizeof(b))
{
if (b[0] == 0xff && b[1] == 0xd8 && b[2] == 0xff && (b[3] & 0xf0) == 0xe0)
{
filecounter++;
char filename[10];
sprintf(filename, "%03i.jpg", filecounter);
FILE *img = fopen(filename, "w");
BYTE BLOCK[512];
//Same checking for end of File
if (fread(&BLOCK, sizeof(BLOCK), sizeof(BLOCK), f) != sizeof(BLOCK))
{
fclose(img);
fclose(f);
return 1;
}
fwrite(&BLOCK, 512, 512, img);
fclose(img);
}
}
fclose(f);
return 0;
}
我尝试对多行代码进行调试,但最终不得不删除大部分程序才能停止出现分段错误,因此我无法真正检查错误在哪里。
好吧,首先你有一个很大的错误。 在
while (fread(&b, sizeof(b), sizeof(b), f) == sizeof(b))
中,您在错误的地方使用了 &
。你不应该使用它,你使用的函数是 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
它将获得变量的引用。
fread 读取了 4x4 字节,您想要读取 16 字节还是 4 字节?对于文件计数器的某些较大值来说,文件名 10 个字符也可能很小。