CS5Ox Pset4恢复:代码仅恢复部分图像

时间:2017-03-22 17:55:58

标签: c cs50

我有一些CS50 Pset4的半工作代码。如果你运行它,你会发现它恢复了27个jpg文件,但只有前几行是可见的。

有人能指出我正确的方向吗?

 DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
 String result = df.format(date);

1 个答案:

答案 0 :(得分:0)

我看到几件可能导致这个问题的事情。

首先,检查n计数器的顺序。应该在实际开始编写新文件之前添加计数器,但这只是一个偏好问题,以及您希望代码的清洁程度。

其次,尝试使用以下代码替换您的else条件:

if(outfile != NULL)                          
      {
        fwrite(buffer, 512, 1, outfile);
}

注意:请注意,我已将else条件替换为if条件。这是因为当满足第一个if条件时,它会执行这个条件并“跳出块”。因此else只会执行第一个if条件。 如果您想保持else条件,那么您必须嵌套另一个if,就像您在代码中所做的那样。

else代替if,无论jpg的前3个字节的值是什么,都将被检查(也就是说,无论它们是0x00,0xff,0x00) ,您将获得一个清晰易懂的代码。

最后,更重要的是:你为什么要在同一个操作中两次写入同一个文件?请注意fwrite()计数器下方的n++功能。真的有必要吗?

换句话说:删除这一行:

// read one block fread(buffer, 512, 1, infile);

其他错误,就是你正在阅读你的文件两次,并且每一步都提前两次,所以你将获得一半的信息。 这就是你获得一半图像(27个左右)的原因。

删除这两行:

// read one block fread(buffer, 512, 1, infile);

正如我所说,通过在文件中读取和写入两次,您可以获得一半的信息。这导致了一种模糊的方式,在这种方式中,你的图像都是用无意义的颜色(我猜)和一半的图像文件着色的。

我已经使用您的代码和我刚刚提供的固定解决方案运行check50 2016.recover recover.c,并且它通过了CS50的check50中的所有检查。花点时间思考程序中的所有内容,包括控制流,这是它的一个重要部分,以及指针用法。

在没有任何经验的情况下启动CS50可能会让人望而生畏。保持。你已经几乎进入了第5周。