>> [音樂播放]
>> 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。