我有一些CS50 Pset4的半工作代码。如果你运行它,你会发现它恢复了27个jpg文件,但只有前几行是可见的。
有人能指出我正确的方向吗?
DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
String result = df.format(date);
答案 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周。