我也使用过Valgrind,但仍然找不到错误。恢复图像是CS50问题。
#include <stdio.h>
#include<stdint.h>
#include <stdlib.h>
typedef uint8_t BYTE;
int main(int argc, char *argv[])
{
if ( argc != 2)
{
printf("Usage : ./recover image\n");
return 1;
}
//Condition to check whether the file opens or not.
FILE *file = fopen(argv[1], "r");
int c=0;
FILE *img;
char *fileName = malloc(sizeof(char)*10);
if(fileName == NULL)
return 1;
//Below is the dynamic reading of file.
do
{
int *arr = malloc(sizeof(BYTE)*512);
if(arr == NULL)
return 1;
fread(arr,sizeof(BYTE),512,file);
if(arr [0] == 0xff && arr[1] == 0xd8 && arr[2] == 0xff && (arr[3] & 0xf0) == 0xe0)
{
if(c == 0)
{
img = fopen(" 000.jpg","a");// check for w or a
fwrite(arr,sizeof(BYTE),512,img);
}
else
{
fclose(img);
sprintf(fileName,"%03i.jpg",c);
img = fopen(fileName,"a");//check for w or a
fwrite(arr,sizeof(BYTE),512,img);
}
c++;
}
else
{
if(c!=0)
{
img = fopen(fileName,"a");
fwrite(arr,sizeof(BYTE),512,img);
}
}
free(arr);
}while(getc(file) != EOF);
if(img != NULL)
fclose(file);
fclose(img);
free(fileName);
}
你的问题是你的代码很糟糕。你缺少的是错误检查。大多数库函数(如
fopen
、malloc
等)都会通过返回值指示是否成功。例如,如果您要打开的文件不存在,fopen
可能会失败。
请参阅 fopen 文档。
成功完成后,fopen()、fdopen() 和 freopen() 返回 文件指针。否则,返回 NULL 并将 errno 设置为 指出错误。
对于代码中的每个库调用,请考虑如果函数失败会发生什么。您需要考虑这种情况。您至少应该做的是打印错误消息并正确退出程序。
例如对于
fopen
:
*file = fopen(argv[1], "r");
if (file == NULL) {
fprintf(stderr, "fopen() failed: %s\n", strerror(errno));
return 1;
}
// ...
您在代码中检查过这一点吗?
int *arr = malloc(sizeof(BYTE)*512);
我不明白你在哪里释放它。尝试一下并告诉我,我可以提供帮助