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