cs50 - CS50 Recover 运行并恢复除第一个文件之外的所有文件
问题描述
我的问题是关于作为 CS50 一部分的恢复任务。
代码正在运行(最终),它生成了 50 个 JPEG 文件,其中大多数是正确的图像,除了第一个文件不是图像,因此它没有通过 check50。
我花了很长时间试图找出问题所在,但我无法确定它,所以我希望有人能够帮助我,这样我就可以继续前进。
提前致谢!这是我的代码:
int main(int argc, char *argv[])
{
// ensure proper usage
if (argc != 2)
{
fprintf(stderr, "Usage: Name of Memory Card File\n");
return 1;
}
char *readfile = argv[1];
// open memory card file
FILE *card_ptr = fopen(readfile, "r");
if (card_ptr == NULL)
{
fprintf(stderr, "Could not open %s.\n", readfile);
return 2;
}
//Declare a buffer to read into
unsigned char *buffer = malloc(512);
//to check if we have already found a file
bool (jpgAlreadyNew) = false;
//declare counter for the number of files found and a file pointer
int filenumber = 0;
FILE *new_jpg_ptr = NULL;
char filename[8];
//read in bytes until reach EOF
while (fread(buffer, 1, 512, card_ptr) != 0x00)
{
//if we reach the header pattern of bytes
if (buffer [0] == 0xff && buffer [1] == 0xd8 && buffer [2] == 0xff && (buffer [3] & 0xf0) == 0xe0)
{
//if there is not already a JPEG file found
if (!jpgAlreadyNew)
{
//change the bool value
(jpgAlreadyNew) = true;
//open new file
sprintf(filename, "%03i.jpg", filenumber);
new_jpg_ptr = fopen(filename, "w");
if (new_jpg_ptr == NULL)
{
return 3;
}
//add to counter of files found
filenumber++;
//write files from buffer into new img file
fwrite(buffer, 1, 512, new_jpg_ptr);
}
//if there is already a JPEG file found
if (jpgAlreadyNew)
{
//close the previous file which would now be complete
fclose(new_jpg_ptr);
//open new file
sprintf(filename, "%03i.jpg", filenumber);
new_jpg_ptr = fopen(filename, "w");
if (new_jpg_ptr == NULL)
{
return 4;
}
//add to counter of files found
filenumber++;
//write files from buffer into new img file
fwrite(buffer, 1, 512, new_jpg_ptr);
}
}
// else if we do not see pattern of header bytes
else
{
//if already found a jpg file which is open then write the bytes to that file
if (jpgAlreadyNew)
{
fwrite(buffer, 1, 512, new_jpg_ptr);
}
//if no file found yet, discard and move on
if (!jpgAlreadyNew)
{
continue;
}
}
}
//free memory
free (buffer);
//close pointers and end program successfully
fclose(card_ptr);
fclose(new_jpg_ptr);
return 0;
}
解决方案
让我们从找到第一个 jpeg 签名开始浏览程序:
这if (!jpgAlreadyNew)
评估为真,因此它进入 if 块;它做的第一件事是(jpgAlreadyNew) = true;
。完成创建文件并写入第一个块后,接下来会发生什么?这if (jpgAlreadyNew)
. 这也评估为真。所以它关闭 000.jpg 并继续移动。
由于jpgAlreadyNew
是布尔值,因此if {} else {}
构造就足够了。
推荐阅读
- gcc - 为什么动态链接需要在 Linux 平台上存在带有 GCC 的 SO 文件?
- abap - SAP SALV 总是在列标题中显示长文本
- symfony - 可空列的数据库架构不同步
- python - 在 Visual Studio Code 中设置选项卡空间样式...根据项目类型
- php - 一次查询中的对话用户列表
- mysql - MySQL:如果不存在则迭代插入一条记录
- linux - 如何使命令行参数变量包含标记空格和其他特殊字符的反斜杠?
- android - Android:编写一个在任何地方使用警报对话框的类
- c++ - 如何使用位域结构和联合制作 4 个字节?
- python - python与sqlite3 db一起工作,从db中保存、更新和检索文本