Tip:
Highlight text to annotate it
X
>> [音乐播放]
>> 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。