[音乐播放] ZAMYLA陈:让我们来解决恢复。 恢复大概是我最喜欢的PSET, ,主要是因为我认为这是 真的,真的很酷。 基本上,你给出一个记忆 卡文件中, 图像已被删除。 但是,你要什么 做的是恢复他们所有。 确定。 所以这是非常激动人心的,但也许一 有点吓人,因为你 给定一个空的C文件和 你必须填写。 好了,让我们打破这种 成可管理的部分。 你要打开 内存卡文件。 这似乎很简单。 然后,找到开始 的JPG图片。 所有在此内存中的文件 卡都将是JPG格式。 然后,一旦你发现之初, 你要打开一个新的JPG,那 是一样,创建一个JPG文件,并写512 在同一时间,直到一个新的JPG是字节 发现,并结束该程序,一旦 你侦测文件的末尾。 所以,第一步首先是要打开 存储卡的文件。 但你知道这已经,而且也 文件I / O功能,那将 证明是非常有用的。 确定。 那么什么是JPG格式? 因为我们需要开始的时候。 好吧,JPG格式,就像位图, 是字节的只是序列。 幸运的是,每一个JPG文件开始与任何 为0xff,为0xD8,255,0XE0,一个序列 的字节,或另一 字节序列。 因此,这四个字节表示 一个JPG文件的开始。 没有比这两个组合其他 的4个字节。 而幸运的是,另一个事实是,我们 可以利用的就是每一个 JPG存储并排侧 在存储卡。 我所代表的结构 示意图在此存储卡 滑动在这里。 在这里,每一个广场,每一个矩形, 代表512个字节,并开始 在一个灰色的,我们不 真的有一个JPG文件。 但后来,我们终于打 有星号的块。 这意味着,前四个字节出 那些512是指两个中的一个 开始的JPG序列。 我们从那里,然后一旦 1 JPG结束,下一个开始。 我们永远不要有任何更多 灰色空间在两者之间。 但是,我们到底怎么读这一点, 读取512字节,这样我们可以使 比较的第一个地方? 好吧,让我们回到FREAD,这 在需要将包含结构 您正在阅读的字节数。 所以,你要放 那些在那里 - 的大小,数量,然后inpointer 您正在阅读的。 现在,我们要读512的时间,并 我们要存储这个缓冲区中, 我要调用它。 基本上,我们打算举行 那些上512字节和做 事情有了它,对不对? 我们不是要比较的第一个 四个字节,或者我们要 读它,好不好? 那么接下来的数据指针,然后将 作为您的缓冲区, inpointer,嗯,这只是要 是你的内存卡。 回到我们的记忆卡原理图。 我们要读512字节的时间, 存储每512字节块 到缓冲区中,抓着那些 缓冲,这些512字节,直到我们知道 到底该怎么做他们。 所以一开始没有什么,所以 我们将读取缓冲区,比较它, 我们将不再需要用它做任何事情。 然后,我们终于打了一个星 封锁,这意味着我们已经 发现我们的第一个JPG文件。 因此,缓冲区现在持有 从JPG字节。 下一次512个字节,因为他们 不是明星的块,也 该JPG的一部分。 和JPG格式是从那里连续 在,直到我们打了下一个JPG文件。 然后在缓冲区,然后保存 512字节为JPG和 等等,等等。 确定。 所以,一旦你打的第一个星号的 块,第一个JPG文件,你怎么 其实,好了,打开它? 让我们做一个新的JPG。 文件名的JPG格式要 在该格式中,数,数字, number.jpg,因为他们在一个名为 它们被发现的顺序, 从0开始。 所以第一个JPG文件,你 发现将被000.jpg。 所以,可能是一个好主意来跟踪 你有多少JPG格式迄今为止发现。 所以这是文件名。 但是你怎么居然作出这样的? 好了,我们要使用一个 函数调用sprintf的。 类似于printf的一点点,在那里 您可以使用占位符的字符串, 除了在这种情况下,sprintf的将打印 出该文件到当前 目录,而不是到终端。 确定。 所以在这里我们可以看到,我们有标题, 一个char数组将存储 结果字符串,并且我们通过在 与实际字符串的标题 占位符,就像我们已经 学会做的printf。 但是这个代码,我这里 会给2.JPG,不002.JPG。 所以我会离开你找出如何 修改中的占位符以使 正确的名称。 确定。 所以,一旦你sprintf'd那么你就可以 打开该文件,因为它存在于 您的目录,用fopen,使用 标题,然后你想要的任何方式 英寸打开该文件 所以,现在,我们已经打开了一个新的JPG文件, 现在我们可以在写512个字节 时间,直到新的JPG被发现。 因此,让我们再看一下 在fwrite的语法。 我知道,我展示这张幻灯片一 很多,但我只是想确保 你们不要太糊涂了,因为 我知道这是很容易 混淆的第一个和最后一个 的说法,尤其如此。 但要记住,你是从写 您的缓冲区到了文件中的图像。 现在你知道怎么写512 字节到,你已经你的JPG文件 创建好了,我们要停止 过程中,一旦我们已经达到的结束 我们的卡,因为不会有 任何更多的图像被发现。 因此,让我们回去的fread 再一次,我保证。 用fread返回的大小多少个项目, 大小,准备成功。 理想情况下,这将是任何 您传递的数量,对不对? 因为你试图读取数 的大小,尺寸元素。 但如果用fread不能够读取该 元素的个数,那么它将返回 不管它多少成功读取。 现在,需要注意的一件重要的事情是 如果您使用其他文件I / O 象龟etc功能,它也将返回 有多少项目是成功读取。 什么是关于这个功能是非常有用 如果你使用的内部功能 情况下,它会执行本身,而 判定条件,这是 只是真的很有用。 所以,如果你有这样的情况,比方说, 如果用fread缓冲区的sizeof狗,2, 指针,等于等于1,即 也就是说,我想读 2狗的时候。 但如果用fread返回,而不是2 1作为 预期,这意味着有2 留在我的文件中的狗,而是1。 但是,如果返回2,那么我仍然有 那些狗2我的缓冲区内。 所以,现在给你如何感 检查该文件的结束,但 让我们通过现在的逻辑。 我们到底怎么拼凑所有 这些元素结合在一起? 一旦我们达到我们的第一个JPG文件,因为 我们知道,JPG格式存储 连续,我们会写,直到 我们到达卡片文件的末尾。 但我们不想写 什么再说吧。 所以它很重要,不仅是我们在 新的JPG开始,但无论 我们已经找到了一个JPG或者没有。 如果它是一个新的JPG的开始,我们将 要关闭我们目前的JPG文件,如果 我们有一个开放的,开放的 一个新的写进去。 如果不是新的JPG的开始, 不过,我们将保持相同的JPG文件 打开和写入到这一点。 我们会写我们的缓冲区中取 我们有开放的JPG文件,但前提是 我们有一个开放的,当然。 如果我们还没有发现我们的第一个JPG 然而,我们不写任何东西。 而这个过程一直持续到你 到达卡片文件的末尾。 最后,你会希望 确保您FCLOSE任何 你已经fopened文件。 一旦你熟悉了 概念,来看看一些 伪代码,我已经包括在这里。 首先,你要打开的卡文件, 然后重复以下过程 直到你已经达到了 该卡的结束。 你想读的512个字节 入缓冲区。 使用该缓冲区,你要检查 无论你是在一个开始 新的JPG或没有。 而这个问题的答案会 影响你的文件管理 - 你打开文件, 那些你关闭。 那么,你已经找到了一个JPG文件? 你是如何一直保持 轨迹是什么? 然后,根据这一点,你会要么 写入到当前的JPG,你 有开放的,或者不写它在所有, 因为你还没有找到一个JPG文件呢。 最后,一​​旦你已经达到年底 该文件,你要关闭任何 其余的已打开的文件。 我们希望在这里整齐。 有了这样的,你已经恢复了所有的 从内存中丢失的文件 卡,这是一个相当惊人的壮举。 于是拍拍自己的背。 但是,还有一元素 在PSET,这是比赛。 你会发现,所有的图片 你已经恢复实际上是 CS50的工作人员的照片。 所以,如果你在校园里或其他地方 近了,那么你可以拍摄 工作人员,并具有节 最留念的工作人员 从他们恢复的文件将 得到一个真棒奖品。 有了这一点,那么你已经完成 在恢复PSET。 我的名字是Zamyla,这是CS50。