1 00:00:00,000 --> 00:00:09,780 >> [音樂播放] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA陳:讓我們來解決恢復。 3 00:00:11,150 --> 00:00:14,030 恢復大概是我最喜歡的PSET, ,主要是因為我認為這是 4 00:00:14,030 --> 00:00:15,650 真的,真的很酷。 5 00:00:15,650 --> 00:00:19,040 基本上,你給出一個記憶 卡文件中, 6 00:00:19,040 --> 00:00:20,900 圖像已被刪除。 7 00:00:20,900 --> 00:00:23,650 但是,你要什麼 做的是恢復他們所有。 8 00:00:23,650 --> 00:00:24,250 >> 確定。 9 00:00:24,250 --> 00:00:28,230 所以這是非常激動人心的,但也許一 有點嚇人,因為你 10 00:00:28,230 --> 00:00:32,430 給定一個空的C文件和 你必須填寫。 11 00:00:32,430 --> 00:00:36,250 好了,讓我們打破這種 成可管理的部分。 12 00:00:36,250 --> 00:00:38,160 你要打開 內存卡文件。 13 00:00:38,160 --> 00:00:39,900 這似乎很簡單。 14 00:00:39,900 --> 00:00:43,030 然後,找到開始 的JPG圖片。 15 00:00:43,030 --> 00:00:46,740 所有在此內存中的文件 卡都將是JPG格式。 16 00:00:46,740 --> 00:00:50,840 然後,一旦你發現之初, 你要打開一個新的JPG,那 17 00:00:50,840 --> 00:00:57,610 是一樣,創建一個JPG文件,並寫512 在同一時間,直到一個新的JPG是字節 18 00:00:57,610 --> 00:01:02,930 發現,並結束該程序,一旦 你偵測文件的末尾。 19 00:01:02,930 --> 00:01:06,400 >> 所以,第一步首先是要打開 存儲卡的文件。 20 00:01:06,400 --> 00:01:09,850 但你知道這已經,而且也 文件I / O功能,那將 21 00:01:09,850 --> 00:01:12,030 證明是非常有用的。 22 00:01:12,030 --> 00:01:12,820 確定。 23 00:01:12,820 --> 00:01:14,760 那麼什麼是JPG格式? 24 00:01:14,760 --> 00:01:16,330 因為我們需要開始的時候。 25 00:01:16,330 --> 00:01:21,310 好吧,JPG格式,就像位圖, 是字節的只是序列。 26 00:01:21,310 --> 00:01:30,660 幸運的是,每一個JPG文件開始與任何 為0xff,為0xD8,255,0XE0,一個序列 27 00:01:30,660 --> 00:01:33,610 的字節,或另一 字節序列。 28 00:01:33,610 --> 00:01:37,250 >> 因此,這四個字節表示 一個JPG文件的開始。 29 00:01:37,250 --> 00:01:40,780 沒有比這兩個組合其他 的4個字節。 30 00:01:40,780 --> 00:01:44,840 而幸運的是,另一個事實是,我們 可以利用的就是每一個 31 00:01:44,840 --> 00:01:48,550 JPG存儲並排側 在存儲卡。 32 00:01:48,550 --> 00:01:52,210 我所代表的結構 示意圖在此存儲卡 33 00:01:52,210 --> 00:01:53,310 滑動在這裡。 34 00:01:53,310 --> 00:01:59,270 在這裡,每一個廣場,每一個矩形, 代表512個字節,並開始 35 00:01:59,270 --> 00:02:01,750 在一個灰色的,我們不 真的有一個JPG文件。 36 00:02:01,750 --> 00:02:05,700 >> 但後​​來,我們終於打 有星號的塊。 37 00:02:05,700 --> 00:02:10,940 這意味著,前四個字節出 那些512是指兩個中的一個 38 00:02:10,940 --> 00:02:13,230 開始的JPG序列。 39 00:02:13,230 --> 00:02:17,340 我們從那裡,然後一旦 1 JPG結束,下一個開始。 40 00:02:17,340 --> 00:02:20,990 我們永遠不要有任何更多 灰色空間在兩者之間。 41 00:02:20,990 --> 00:02:25,550 >> 但是,我們到底怎麼讀這一點, 讀取512字節,這樣我們可以使 42 00:02:25,550 --> 00:02:27,500 比較的第一個地方? 43 00:02:27,500 --> 00:02:33,470 好吧,讓我們回到FREAD,這 在需要將包含結構 44 00:02:33,470 --> 00:02:34,470 您正在閱讀的字節數。 45 00:02:34,470 --> 00:02:36,570 所以,你要放 那些在那裡 - 46 00:02:36,570 --> 00:02:42,192 的大小,數量,然後inpointer 您正在閱讀的。 47 00:02:42,192 --> 00:02:49,900 現在,我們要讀512的時間,並 我們要存儲這個緩衝區中, 48 00:02:49,900 --> 00:02:50,700 我要調用它。 49 00:02:50,700 --> 00:02:54,100 >> 基本上,我們打算舉行 那些上512字節和做 50 00:02:54,100 --> 00:02:55,500 事情有了它,對不對? 51 00:02:55,500 --> 00:02:58,260 我們不是要比較的第一個 四個字節,或者我們要 52 00:02:58,260 --> 00:02:59,830 讀它,好不好? 53 00:02:59,830 --> 00:03:05,050 那麼接下來的數據指針,然後將 作為您的緩衝區, 54 00:03:05,050 --> 00:03:07,745 inpointer,嗯,這只是要 是你的內存卡。 55 00:03:07,745 --> 00:03:09,500 >> 回到我們的記憶卡原理圖。 56 00:03:09,500 --> 00:03:14,690 我們要讀512字節的時間, 存儲每512字節塊 57 00:03:14,690 --> 00:03:19,190 到緩衝區中,抓著那些 緩衝,這些512字節,直到我們知道 58 00:03:19,190 --> 00:03:22,000 到底該怎麼做他們。 59 00:03:22,000 --> 00:03:25,960 所以一開始沒有什麼,所以 我們將讀取緩衝區,比較它, 60 00:03:25,960 --> 00:03:28,160 我們將不再需要用它做任何事情。 61 00:03:28,160 --> 00:03:32,030 然後,我們終於打了一個星 封鎖,這意味著我們已經 62 00:03:32,030 --> 00:03:33,630 發現我們的第一個JPG文件。 63 00:03:33,630 --> 00:03:36,560 因此,緩衝區現在持有 從JPG字節。 64 00:03:36,560 --> 00:03:40,220 >> 下一次512個字節,因為他們 不是明星的塊,也 65 00:03:40,220 --> 00:03:41,740 該JPG的一部分。 66 00:03:41,740 --> 00:03:47,630 和JPG格式是從那裡連續 在,直到我們打了下一個JPG文件。 67 00:03:47,630 --> 00:03:51,880 然後在緩衝區,然後保存 512字節為JPG和 68 00:03:51,880 --> 00:03:53,580 等等,等等。 69 00:03:53,580 --> 00:03:54,250 確定。 70 00:03:54,250 --> 00:03:58,980 >> 所以,一旦你打的第一個星號的 塊,第一個JPG文件,你怎麼 71 00:03:58,980 --> 00:04:01,910 其實,好了,打開它? 72 00:04:01,910 --> 00:04:04,990 讓我們做一個新的JPG。 73 00:04:04,990 --> 00:04:08,846 文件名的JPG格式要 在該格式中,數,數字, 74 00:04:08,846 --> 00:04:13,830 number.jpg,因為他們在一個名為 它們被發現的順序, 75 00:04:13,830 --> 00:04:14,780 從0開始。 76 00:04:14,780 --> 00:04:19,890 >> 所以第一個JPG文件,你 發現將被000.jpg。 77 00:04:19,890 --> 00:04:26,560 所以,可能是一個好主意來跟踪 你有多少JPG格式迄今為止發現。 78 00:04:26,560 --> 00:04:27,610 所以這是文件名。 79 00:04:27,610 --> 00:04:29,660 但是你怎麼居然作出這樣的? 80 00:04:29,660 --> 00:04:34,310 好了,我們要使用一個 函數調用sprintf的。 81 00:04:34,310 --> 00:04:38,260 類似於printf的一點點,在那裡 您可以使用佔位符的字符串, 82 00:04:38,260 --> 00:04:42,420 除了在這種情況下,sprintf的將打印 出該文件到當前 83 00:04:42,420 --> 00:04:45,550 目錄,而不是到終端。 84 00:04:45,550 --> 00:04:46,120 >> 確定。 85 00:04:46,120 --> 00:04:49,950 所以在這裡我們可以看到,我們有標題, 一個char數組將存儲 86 00:04:49,950 --> 00:04:55,120 結果字符串,並且我們通過在 與實際字符串的標題 87 00:04:55,120 --> 00:04:58,720 佔位符,就像我們已經 學會做的printf。 88 00:04:58,720 --> 00:05:05,530 但是這個代碼,我這裡 會給2.JPG,不002.JPG。 89 00:05:05,530 --> 00:05:09,920 所以我會離開你找出如何 修改中的佔位符以使 90 00:05:09,920 --> 00:05:11,920 正確的名稱。 91 00:05:11,920 --> 00:05:12,610 >> 確定。 92 00:05:12,610 --> 00:05:17,390 所以,一旦你sprintf'd那麼你就可以 打開該文件,因為它存在於 93 00:05:17,390 --> 00:05:22,690 您的目錄,用fopen,使用 標題,然後你想要的任何方式 94 00:05:22,690 --> 00:05:25,140 英寸打開該文件 95 00:05:25,140 --> 00:05:30,260 所以,現在,我們已經打開了一個新的JPG文件, 現在我們可以在寫512個字節 96 00:05:30,260 --> 00:05:33,320 時間,直到新的JPG被發現。 97 00:05:33,320 --> 00:05:36,640 因此,讓我們再看一下 在fwrite的語法。 98 00:05:36,640 --> 00:05:40,060 >> 我知道,我展示這張幻燈片一 很多,但我只是想確保 99 00:05:40,060 --> 00:05:43,530 你們不要太糊塗了,因為 我知道這是很容易 100 00:05:43,530 --> 00:05:47,000 混淆的第一個和最後一個 的說法,尤其如此。 101 00:05:47,000 --> 00:05:54,390 但要記住,你是從寫 您的緩衝區到了文件中的圖像。 102 00:05:54,390 --> 00:05:59,250 >> 現在你知道怎麼寫512 字節到,你已經你的JPG文件 103 00:05:59,250 --> 00:06:03,230 創建好了,我們要停止 過程中,一旦我們已經達到的結束 104 00:06:03,230 --> 00:06:06,720 我們的卡,因為不會有 任何更多的圖像被發現。 105 00:06:06,720 --> 00:06:10,760 因此,讓我們回去的fread 再一次,我保證。 106 00:06:10,760 --> 00:06:15,600 用fread返回的大小多少個項目, 大小,準備成功。 107 00:06:15,600 --> 00:06:19,440 理想情況下,這將是任何 您傳遞的數量,對不對? 108 00:06:19,440 --> 00:06:24,140 因為你試圖讀取數 的大小,尺寸元素。 109 00:06:24,140 --> 00:06:29,380 但如果用fread不能夠讀取該 元素的個數,那麼它將返回 110 00:06:29,380 --> 00:06:32,530 不管它多少成功讀取。 111 00:06:32,530 --> 00:06:36,310 >> 現在,需要注意的一件重要的事情是 如果您使用其他文件I / O 112 00:06:36,310 --> 00:06:43,860 象龜etc功能,它也將返回 有多少項目是成功讀取。 113 00:06:43,860 --> 00:06:48,000 什麼是關於這個功能是非常有用 如果你使用的內部功能 114 00:06:48,000 --> 00:06:53,190 情況下,它會執行本身,而 判定條件,這是 115 00:06:53,190 --> 00:06:54,340 只是真的很有用。 116 00:06:54,340 --> 00:07:00,440 所以,如果你有這樣的情況,比方說, 如果用fread緩衝區的sizeof狗,2, 117 00:07:00,440 --> 00:07:04,870 指針,等於等於1,即 也就是說,我想讀 118 00:07:04,870 --> 00:07:06,540 2狗的時候。 119 00:07:06,540 --> 00:07:13,490 但如果用fread返回,而不是2 1作為 預期,這意味著有2 120 00:07:13,490 --> 00:07:16,480 留在我的文件中的狗,而是1。 121 00:07:16,480 --> 00:07:22,450 但是,如果返回2,那麼我仍然有 那些狗2我的緩衝區內。 122 00:07:22,450 --> 00:07:26,280 >> 所以,現在給你如何感 檢查該文件的結束,但 123 00:07:26,280 --> 00:07:28,940 讓我們通過現在的邏輯。 124 00:07:28,940 --> 00:07:32,460 我們到底怎麼拼湊所有 這些元素結合在一起? 125 00:07:32,460 --> 00:07:36,880 一旦我們達到我們的第一個JPG文件,因為 我們知道,JPG格式存儲 126 00:07:36,880 --> 00:07:40,910 連續,我們會寫,直到 我們到達卡片文件的末尾。 127 00:07:40,910 --> 00:07:43,950 但我們不想寫 什麼再說吧。 128 00:07:43,950 --> 00:07:48,710 所以它很重要,不僅是我們在 新的JPG開始,但無論 129 00:07:48,710 --> 00:07:50,655 我們已經找到了一個JPG或者沒有。 130 00:07:50,655 --> 00:07:55,390 >> 如果它是一個新的JPG的開始,我們將 要關閉我們目前的JPG文件,如果 131 00:07:55,390 --> 00:07:59,110 我們有一個開放的,開放的 一個新的寫進去。 132 00:07:59,110 --> 00:08:03,340 如果不是新的JPG的開始, 不過,我們將保持相同的JPG文件 133 00:08:03,340 --> 00:08:05,910 打開和寫入到這一點。 134 00:08:05,910 --> 00:08:10,100 我們會寫我們的緩衝區中取 我們有開放的JPG文件,但前提是 135 00:08:10,100 --> 00:08:12,120 我們有一個開放的,當然。 136 00:08:12,120 --> 00:08:16,190 如果我們還沒有發現我們的第一個JPG 然而,我們不寫任何東西。 137 00:08:16,190 --> 00:08:20,290 而這個過程一直持續到你 到達卡片文件的末尾。 138 00:08:20,290 --> 00:08:23,410 >> 最後,你會希望 確保您FCLOSE任何 139 00:08:23,410 --> 00:08:25,800 你已經fopened文件。 140 00:08:25,800 --> 00:08:28,360 一旦你熟悉了 概念,來看看一些 141 00:08:28,360 --> 00:08:30,840 偽代碼,我已經包括在這裡。 142 00:08:30,840 --> 00:08:34,830 首先,你要打開的卡文件, 然後重複以下過程 143 00:08:34,830 --> 00:08:37,144 直到你已經達到了 該卡的結束。 144 00:08:37,144 --> 00:08:40,880 你想讀的512個字節 入緩衝區。 145 00:08:40,880 --> 00:08:43,934 使用該緩衝區,你要檢查 無論你是在一個開始 146 00:08:43,934 --> 00:08:45,300 新的JPG或沒有。 147 00:08:45,300 --> 00:08:48,400 而這個問題的答案會 影響你的文件管理 - 148 00:08:48,400 --> 00:08:51,940 你打開文件, 那些你關閉。 149 00:08:51,940 --> 00:08:55,220 >> 那麼,你已經找到了一個JPG文件? 150 00:08:55,220 --> 00:08:57,740 你是如何一直保持 軌跡是什麼? 151 00:08:57,740 --> 00:09:01,735 然後,根據這一點,你會要么 寫入到當前的JPG,你 152 00:09:01,735 --> 00:09:07,090 有開放的,或者不寫它在所有, 因為你還沒有找到一個JPG文件呢。 153 00:09:07,090 --> 00:09:10,870 最後,一旦你已經達到年底 該文件,你要關閉任何 154 00:09:10,870 --> 00:09:12,590 其餘的已打開的文件。 155 00:09:12,590 --> 00:09:14,590 我們希望在這裡整齊。 156 00:09:14,590 --> 00:09:18,790 >> 有了這樣的,你已經恢復了所有的 從內存中丟失的文件 157 00:09:18,790 --> 00:09:21,620 卡,這是一個相當驚人的壯舉。 158 00:09:21,620 --> 00:09:23,430 於是拍拍自己的背。 159 00:09:23,430 --> 00:09:27,560 但是,還有一元素 在PSET,這是比賽。 160 00:09:27,560 --> 00:09:30,920 你會發現,所有的圖片 你已經恢復實際上是 161 00:09:30,920 --> 00:09:32,820 CS50的工作人員的照片。 162 00:09:32,820 --> 00:09:38,500 所以,如果你在校園裡或其他地方 近了,那麼你可以拍攝 163 00:09:38,500 --> 00:09:42,600 工作人員,並具有節 最留念的工作人員 164 00:09:42,600 --> 00:09:46,940 從他們恢復的文件將 得到一個真棒獎品。 165 00:09:46,940 --> 00:09:50,650 有了這一點,那麼你已經完成 在恢復PSET。 166 00:09:50,650 --> 00:09:53,600 我的名字是Zamyla,這是CS50。 167 00:09:53,600 --> 00:10:01,835