1 00:00:00,000 --> 00:00:09,780 >> [MUZYKA GRA] 2 00:00:09,780 --> 00:00:11,150 >> ZAMYLA Chandler: Zajmijmy się odzyskać. 3 00:00:11,150 --> 00:00:14,030 Odzyskaj to chyba mój ulubiony PSET, i głównie dlatego myślę, że to 4 00:00:14,030 --> 00:00:15,650 naprawdę, naprawdę fajne. 5 00:00:15,650 --> 00:00:19,040 Zasadniczo, dostaniemy pamięć plik, w którym karta 6 00:00:19,040 --> 00:00:20,900 zdjęcia zostały usunięte. 7 00:00:20,900 --> 00:00:23,650 Ale to, co masz zamiar zrobić, to odzyskać je wszystkie. 8 00:00:23,650 --> 00:00:24,250 >> OK. 9 00:00:24,250 --> 00:00:28,230 Więc jest to naprawdę ekscytujące, ale może trochę zastraszenia, bo jesteś 10 00:00:28,230 --> 00:00:32,430 dany plik C i pusty trzeba wypełnić go w. 11 00:00:32,430 --> 00:00:36,250 OK, więc niech podzielenie na części w zarządzaniu. 12 00:00:36,250 --> 00:00:38,160 Będziemy chcieli, aby otworzyć plików na karcie pamięci. 13 00:00:38,160 --> 00:00:39,900 To wydaje się dość proste. 14 00:00:39,900 --> 00:00:43,030 Następnie znaleźć początek z obrazu JPG. 15 00:00:43,030 --> 00:00:46,740 Wszystkie pliki na tej pamięci karty będą formatu JPG. 16 00:00:46,740 --> 00:00:50,840 Następnie, po znalezieniu na początku, masz zamiar otworzyć nowy JPG, że 17 00:00:50,840 --> 00:00:57,610 jest, jak, stworzyć JPG, i pisać 512 bajt w czasie, aż nowy JPG jest 18 00:00:57,610 --> 00:01:02,930 znaleziono, a zakończenie programu raz wykryć końca pliku. 19 00:01:02,930 --> 00:01:06,400 >> Tak więc pierwsze kroki pierwsze jest otwarcie plików na karcie pamięci. 20 00:01:06,400 --> 00:01:09,850 Ale wiesz, że to już, i nie Funkcja plików I / O, która będzie 21 00:01:09,850 --> 00:01:12,030 okazać się bardzo przydatne. 22 00:01:12,030 --> 00:01:12,820 OK. 23 00:01:12,820 --> 00:01:14,760 Więc co to są pliki JPG? 24 00:01:14,760 --> 00:01:16,330 Ponieważ musimy na początku tego. 25 00:01:16,330 --> 00:01:21,310 Cóż, do formatu JPG, tak jak mapy bitowe, to tylko sekwencje bajtów. 26 00:01:21,310 --> 00:01:30,660 Na szczęście, każdy JPG zaczyna się albo 0xff, 0xd8, 0xff, 0xe0, jedna sekwencja 27 00:01:30,660 --> 00:01:33,610 bajtów, lub innego sekwencja bajtów. 28 00:01:33,610 --> 00:01:37,250 >> Tak więc te cztery bajty wskazują początek JPG. 29 00:01:37,250 --> 00:01:40,780 Brak, z wyjątkiem tych dwóch kombinacjach czterech bajtów. 30 00:01:40,780 --> 00:01:44,840 I na szczęście dla nas, że mamy kolejny fakt mogą skorzystać z jest to, że każdy 31 00:01:44,840 --> 00:01:48,550 JPG jest zapisywany side-by-side na karcie pamięci. 32 00:01:48,550 --> 00:01:52,210 Mam reprezentowane strukturę Karta pamięci schematycznie na to 33 00:01:52,210 --> 00:01:53,310 przesuń tutaj. 34 00:01:53,310 --> 00:01:59,270 Tutaj, każdy kwadrat, każdy prostokąt, oznacza 512 bajtów, a zaczyna 35 00:01:59,270 --> 00:02:01,750 z szarym w to, że nie naprawdę mają JPG. 36 00:02:01,750 --> 00:02:05,700 >> Ale w końcu trafić Blok z gwiazdą. 37 00:02:05,700 --> 00:02:10,940 Oznacza to, że pierwsze cztery bajty z z tych 512 to jeden z tych dwóch 38 00:02:10,940 --> 00:02:13,230 począwszy sekwencje formacie JPG. 39 00:02:13,230 --> 00:02:17,340 A my go stamtąd, a następnie po jeden JPG kończy, druga zaczyna. 40 00:02:17,340 --> 00:02:20,990 Nie ma już więcej nigdy szara przestrzeń pomiędzy. 41 00:02:20,990 --> 00:02:25,550 >> Ale jak właściwie odczytać to, i przeczytaj 512 bajtów, tak, że możemy 42 00:02:25,550 --> 00:02:27,500 Porównanie pierwsze miejsce? 43 00:02:27,500 --> 00:02:33,470 Dobrze, wróćmy do fread, które zasysa struktury, które zawierają 44 00:02:33,470 --> 00:02:34,470 bajty, które czytasz. 45 00:02:34,470 --> 00:02:36,570 Więc masz zamiar umieścić ci tam - 46 00:02:36,570 --> 00:02:42,192 wielkość, ilość, a następnie inpointer że czytasz z. 47 00:02:42,192 --> 00:02:49,900 Teraz chcemy, aby przeczytać 512 na raz, i chcemy zapisać to w buforze, 48 00:02:49,900 --> 00:02:50,700 Zamierzam go nazwać. 49 00:02:50,700 --> 00:02:54,100 >> Zasadniczo, mamy zamiar trzymać na tych, a nie 512 bajtów 50 00:02:54,100 --> 00:02:55,500 rzeczy z nim, prawda? 51 00:02:55,500 --> 00:02:58,260 Jesteśmy albo zamiar porównać pierwszy cztery bajty, lub mamy zamiar 52 00:02:58,260 --> 00:02:59,830 Przeczytałem ją w, OK? 53 00:02:59,830 --> 00:03:05,050 Tak więc dane będą następnie wskaźnik służyć jako bufor i 54 00:03:05,050 --> 00:03:07,745 inpointer, dobrze, że po prostu będzie się karta pamięci. 55 00:03:07,745 --> 00:03:09,500 >> Z powrotem do naszych kart pamięci schemacie. 56 00:03:09,500 --> 00:03:14,690 Jedziemy do odczytu 512 bajtów na raz, przechowywania każdego 512-bajtowy blok 57 00:03:14,690 --> 00:03:19,190 do bufora, trzymając się tych bufor, te 512 bajtów, dopóki nie wiemy 58 00:03:19,190 --> 00:03:22,000 dokładnie to, co do nich. 59 00:03:22,000 --> 00:03:25,960 Tak więc początek nie jest coś, więc będziemy czytać bufor, porównać je i 60 00:03:25,960 --> 00:03:28,160 nie trzeba będzie nic z nim zrobić. 61 00:03:28,160 --> 00:03:32,030 A następnie, w końcu uderzył w gwiazdę zablokować, co oznacza, że ​​mamy 62 00:03:32,030 --> 00:03:33,630 że nasz pierwszy JPG. 63 00:03:33,630 --> 00:03:36,560 Więc teraz trzymać bufor bajtów z tego JPG. 64 00:03:36,560 --> 00:03:40,220 >> Następnym razem 512 bajtów, ponieważ są one Blok nie gwiazda, są też 65 00:03:40,220 --> 00:03:41,740 część tego JPG. 66 00:03:41,740 --> 00:03:47,630 I jpgs są ciągłe stamtąd na w, aż trafiliśmy do następnego JPG. 67 00:03:47,630 --> 00:03:51,880 A następnie bufor następnie przechowuje 512 bajtów dla tego JPG i 68 00:03:51,880 --> 00:03:53,580 tak dalej, i tak dalej. 69 00:03:53,580 --> 00:03:54,250 OK. 70 00:03:54,250 --> 00:03:58,980 >> Więc po raz pierwszy wystąpili przebój Blok pierwszy JPG, jak można 71 00:03:58,980 --> 00:04:01,910 faktycznie, dobrze, otworzyć go? 72 00:04:01,910 --> 00:04:04,990 Zróbmy nowy JPG. 73 00:04:04,990 --> 00:04:08,846 Nazwy plików w formacie JPG zamiar być w formacie, liczba, liczba, 74 00:04:08,846 --> 00:04:13,830 number.jpg, w które są one nazywane w Kolejność, w jakiej one występują, 75 00:04:13,830 --> 00:04:14,780 zaczynając od 0. 76 00:04:14,780 --> 00:04:19,890 >> Tak, że pierwszy JPG 000.jpg będzie znaleźć. 77 00:04:19,890 --> 00:04:26,560 Więc chyba dobry pomysł, aby śledzić o ile jpgs znalazłeś do tej pory. 78 00:04:26,560 --> 00:04:27,610 Więc to jest nazwa pliku. 79 00:04:27,610 --> 00:04:29,660 Ale jak można rzeczywiście zrobić to? 80 00:04:29,660 --> 00:04:34,310 Cóż, będziemy korzystać Funkcja o nazwie sprintf. 81 00:04:34,310 --> 00:04:38,260 Trochę podobna do printf, gdzie można używać symboli zastępczych na smyczki, 82 00:04:38,260 --> 00:04:42,420 wyjątkiem w tym przypadku, będzie sprintf wydrukować Plik się do prądu 83 00:04:42,420 --> 00:04:45,550 katalogu, nie do terminala. 84 00:04:45,550 --> 00:04:46,120 >> OK. 85 00:04:46,120 --> 00:04:49,950 Więc widzimy, że mamy tytuł, tablica char, która będzie przechowywać 86 00:04:49,950 --> 00:04:55,120 Otrzymany ciąg, i mijamy się Tytuł rzeczywistego ciągu z 87 00:04:55,120 --> 00:04:58,720 zastępczy, tak jak my Nauczyłam się robić z printf. 88 00:04:58,720 --> 00:05:05,530 Ale kod, który mam tutaj da 2.jpg, nie 002.jpg. 89 00:05:05,530 --> 00:05:09,920 Więc zostawiam wam, aby dowiedzieć się, jak zmodyfikować symbol zastępczy, aby 90 00:05:09,920 --> 00:05:11,920 poprawna nazwa. 91 00:05:11,920 --> 00:05:12,610 >> OK. 92 00:05:12,610 --> 00:05:17,390 Więc kiedy już sprintf'd następnie można otwórz ten plik, ponieważ istnieje w 93 00:05:17,390 --> 00:05:22,690 katalogiem, z fopen, stosując tytuł, a następnie, co chcesz w trybie 94 00:05:22,690 --> 00:05:25,140 aby otworzyć dany plik w. 95 00:05:25,140 --> 00:05:30,260 Więc teraz, że mamy otwarty nowy plik JPG, teraz możemy napisać 512 bajtów w 96 00:05:30,260 --> 00:05:33,320 czasu, aż nowy JPG znajduje. 97 00:05:33,320 --> 00:05:36,640 Warto więc przyjrzeć w składni fwrite. 98 00:05:36,640 --> 00:05:40,060 >> Wiem, że jestem pokazując tę ​​przesunąć dużo, ale po prostu chcę się upewnić, że 99 00:05:40,060 --> 00:05:43,530 wy nie zbyt zdezorientowany, ponieważ Wiem, że to jest bardzo łatwe do 100 00:05:43,530 --> 00:05:47,000 mieszać się pierwszy i ostatni Argument, w szczególności. 101 00:05:47,000 --> 00:05:54,390 Ale pamiętaj, że piszesz z Twój bufor do plików obrazków. 102 00:05:54,390 --> 00:05:59,250 >> Teraz, gdy wiesz, jak napisać 512 bajtów do pliku JPG, które zostały 103 00:05:59,250 --> 00:06:03,230 stworzony, dobrze, chcemy zatrzymać, że Proces kiedy już dotarł do końca 104 00:06:03,230 --> 00:06:06,720 Nasz karty, ponieważ nie będzie żadnych więcej zdjęć można znaleźć. 105 00:06:06,720 --> 00:06:10,760 Więc wróćmy do fread jeszcze raz, obiecuję. 106 00:06:10,760 --> 00:06:15,600 fread zwraca liczbę elementów o wielkości, rozmiar, były gotowe w pomyślnie. 107 00:06:15,600 --> 00:06:19,440 Idealnie, to będzie co mijamy się na liczby, prawda? 108 00:06:19,440 --> 00:06:24,140 Bo próbujesz przeczytać numer Elementy wielkości, rozmiaru. 109 00:06:24,140 --> 00:06:29,380 Ale jeśli fread nie jest w stanie odczytać, że liczba elementów, to będzie to powrót 110 00:06:29,380 --> 00:06:32,530 bez względu na liczbę czytać pomyślnie. 111 00:06:32,530 --> 00:06:36,310 >> Teraz jedna ważna rzecz, którą należy że jeśli używasz innego pliku I / O 112 00:06:36,310 --> 00:06:43,860 Funkcja jak fgetc, będzie to również powrót ile przedmiotów czytać pomyślnie. 113 00:06:43,860 --> 00:06:48,000 Co jest przydatne o tej funkcji jest , że w przypadku korzystania z funkcji wewnątrz 114 00:06:48,000 --> 00:06:53,190 Stan, będziesz wykonywał się podczas ustalenia, że ​​stan, który jest 115 00:06:53,190 --> 00:06:54,340 tylko naprawdę użyteczne. 116 00:06:54,340 --> 00:07:00,440 Więc jeśli masz to warunki, powiedzmy, jeśli fread bufor, sizeof pies, 2, 117 00:07:00,440 --> 00:07:04,870 wskaźnik, równa jest równa 1, to Oznacza to, że chciałbym, aby przeczytać 118 00:07:04,870 --> 00:07:06,540 2 psy w tym czasie. 119 00:07:06,540 --> 00:07:13,490 Ale jeśli fread zwraca 1, a nie 2, jak oczekuje się, że oznacza to, że istnieje 2 120 00:07:13,490 --> 00:07:16,480 Psy pozostawione w moim pliku, ale 1. 121 00:07:16,480 --> 00:07:22,450 Ale jeśli zwróci 2, to mam jeszcze te 2 psy wewnątrz mojego buforu. 122 00:07:22,450 --> 00:07:26,280 >> Więc teraz, że daje poczucie, jak sprawdź na końcu pliku, ale 123 00:07:26,280 --> 00:07:28,940 idziemy przez obecnie logiki. 124 00:07:28,940 --> 00:07:32,460 Jak faktycznie poskładać wszystko te elementy razem? 125 00:07:32,460 --> 00:07:36,880 Raz trafiliśmy nasz pierwszy JPG, od wiemy, że jpgs są przechowywane 126 00:07:36,880 --> 00:07:40,910 ciągły, będziemy pisać do momentu dotrzemy do końca pliku karty. 127 00:07:40,910 --> 00:07:43,950 Ale nie chcę pisać coś do tego czasu. 128 00:07:43,950 --> 00:07:48,710 Więc nie ma znaczenia, nie tylko, że jesteśmy w Rozpoczęcie nowego JPG, ale czy 129 00:07:48,710 --> 00:07:50,655 my już znaleźliśmy JPG lub nie. 130 00:07:50,655 --> 00:07:55,390 >> Jeśli jest to początek nowej JPG, będziemy chcą zamknąć nasz razie aktualny plik JPG 131 00:07:55,390 --> 00:07:59,110 mamy jedno otwarte i otwarty nowy zapis do. 132 00:07:59,110 --> 00:08:03,340 Jeśli nie jest to początek nowej JPG, jeśli będziemy utrzymywać ten sam plik JPG 133 00:08:03,340 --> 00:08:05,910 otworzyć i dodać do tego. 134 00:08:05,910 --> 00:08:10,100 Będziemy pisać nasz bufor w zależności od tego, Plik JPG mamy otwarte, pod warunkiem, że 135 00:08:10,100 --> 00:08:12,120 mamy jeden otwarty, oczywiście. 136 00:08:12,120 --> 00:08:16,190 Jeśli nie znaleźliśmy nasz pierwszy JPG Jeszcze, nie pisać nic. 137 00:08:16,190 --> 00:08:20,290 I proces ten trwa do momentu dotrzeć do końca tej kartotece. 138 00:08:20,290 --> 00:08:23,410 >> I wreszcie, będziemy chcieli, aby Upewnij się, że fclose dowolny 139 00:08:23,410 --> 00:08:25,800 Pliki, które zostały fopened. 140 00:08:25,800 --> 00:08:28,360 Gdy jesteś wygodne z koncepcje, spojrzeć na niektóre 141 00:08:28,360 --> 00:08:30,840 pseudokod, który podaję tutaj. 142 00:08:30,840 --> 00:08:34,830 Po pierwsze, chcesz otworzyć plik karty, a następnie powtórz następujący proces 143 00:08:34,830 --> 00:08:37,144 dopóki nie osiągnął koniec karty. 144 00:08:37,144 --> 00:08:40,880 Chcesz przeczytać 512 bajtów w buforze. 145 00:08:40,880 --> 00:08:43,934 Korzystanie z tego bufora, będziemy chcieli, aby sprawdzić czy jesteś na początku 146 00:08:43,934 --> 00:08:45,300 Nowy JPG lub nie. 147 00:08:45,300 --> 00:08:48,400 A odpowiedź na to pytanie będzie wpływu na zarządzanie plikami - 148 00:08:48,400 --> 00:08:51,940 które pliki, które można otworzyć, ci, czy zamknąć. 149 00:08:51,940 --> 00:08:55,220 >> Następnie, czy już znaleźli JPG? 150 00:08:55,220 --> 00:08:57,740 Jak się masz utrzymywanie utwór z tego? 151 00:08:57,740 --> 00:09:01,735 Następnie, w zależności od, że albo będziesz Napisać do bieżącego JPG że 152 00:09:01,735 --> 00:09:07,090 mają otwarte, czy nie napisać go w ogóle, dlatego, że nie znalazłem jeszcze JPG. 153 00:09:07,090 --> 00:09:10,870 Wreszcie, gdy już dobiega końca plik, będziemy chcieli, aby zamknąć wszystkie 154 00:09:10,870 --> 00:09:12,590 pozostałe pliki, które zostały otwarte. 155 00:09:12,590 --> 00:09:14,590 Chcemy być schludne tutaj. 156 00:09:14,590 --> 00:09:18,790 >> A z tym, już odzyskać wszystkie brakujące pliki z tej pamięci 157 00:09:18,790 --> 00:09:21,620 Karta, która jest dość niesamowity wyczyn. 158 00:09:21,620 --> 00:09:23,430 Więc pat się na plecach. 159 00:09:23,430 --> 00:09:27,560 Ale jest jeszcze jeden element, PSET, który jest konkurs. 160 00:09:27,560 --> 00:09:30,920 Przekonasz się, że wszystkie zdjęcia które zostały odzyskane są w rzeczywistości 161 00:09:30,920 --> 00:09:32,820 zdjęcia pracowników CS50 jest. 162 00:09:32,820 --> 00:09:38,500 Więc jeśli jesteś gdzieś na terenie kampusu lub w pobliżu, można robić zdjęcia z 163 00:09:38,500 --> 00:09:42,600 personel, a część, która ma większość zdjęć z pracownikami 164 00:09:42,600 --> 00:09:46,940 z ich odzyskanych plików będzie uzyskać niesamowite nagrody. 165 00:09:46,940 --> 00:09:50,650 Z tym, to jesteś gotowy odzyskać pset. 166 00:09:50,650 --> 00:09:53,600 Nazywam się Zamyla, i to jest CS50. 167 00:09:53,600 --> 00:10:01,835