[MUZYKA GRA] ZAMYLA Chandler: Zajmijmy się odzyskać. Odzyskaj to chyba mój ulubiony PSET, i głównie dlatego myślę, że to naprawdę, naprawdę fajne. Zasadniczo, dostaniemy pamięć plik, w którym karta zdjęcia zostały usunięte. Ale to, co masz zamiar zrobić, to odzyskać je wszystkie. OK. Więc jest to naprawdę ekscytujące, ale może trochę zastraszenia, bo jesteś dany plik C i pusty trzeba wypełnić go w. OK, więc niech podzielenie na części w zarządzaniu. Będziemy chcieli, aby otworzyć plików na karcie pamięci. To wydaje się dość proste. Następnie znaleźć początek z obrazu JPG. Wszystkie pliki na tej pamięci karty będą formatu JPG. Następnie, po znalezieniu na początku, masz zamiar otworzyć nowy JPG, że jest, jak, stworzyć JPG, i pisać 512 bajt w czasie, aż nowy JPG jest znaleziono, a zakończenie programu raz wykryć końca pliku. Tak więc pierwsze kroki pierwsze jest otwarcie plików na karcie pamięci. Ale wiesz, że to już, i nie Funkcja plików I / O, która będzie okazać się bardzo przydatne. OK. Więc co to są pliki JPG? Ponieważ musimy na początku tego. Cóż, do formatu JPG, tak jak mapy bitowe, to tylko sekwencje bajtów. Na szczęście, każdy JPG zaczyna się albo 0xff, 0xd8, 0xff, 0xe0, jedna sekwencja bajtów, lub innego sekwencja bajtów. Tak więc te cztery bajty wskazują początek JPG. Brak, z wyjątkiem tych dwóch kombinacjach czterech bajtów. I na szczęście dla nas, że mamy kolejny fakt mogą skorzystać z jest to, że każdy JPG jest zapisywany side-by-side na karcie pamięci. Mam reprezentowane strukturę Karta pamięci schematycznie na to przesuń tutaj. Tutaj, każdy kwadrat, każdy prostokąt, oznacza 512 bajtów, a zaczyna z szarym w to, że nie naprawdę mają JPG. Ale w końcu trafić Blok z gwiazdą. Oznacza to, że pierwsze cztery bajty z z tych 512 to jeden z tych dwóch począwszy sekwencje formacie JPG. A my go stamtąd, a następnie po jeden JPG kończy, druga zaczyna. Nie ma już więcej nigdy szara przestrzeń pomiędzy. Ale jak właściwie odczytać to, i przeczytaj 512 bajtów, tak, że możemy Porównanie pierwsze miejsce? Dobrze, wróćmy do fread, które zasysa struktury, które zawierają bajty, które czytasz. Więc masz zamiar umieścić ci tam - wielkość, ilość, a następnie inpointer że czytasz z. Teraz chcemy, aby przeczytać 512 na raz, i chcemy zapisać to w buforze, Zamierzam go nazwać. Zasadniczo, mamy zamiar trzymać na tych, a nie 512 bajtów rzeczy z nim, prawda? Jesteśmy albo zamiar porównać pierwszy cztery bajty, lub mamy zamiar Przeczytałem ją w, OK? Tak więc dane będą następnie wskaźnik służyć jako bufor i inpointer, dobrze, że po prostu będzie się karta pamięci. Z powrotem do naszych kart pamięci schemacie. Jedziemy do odczytu 512 bajtów na raz, przechowywania każdego 512-bajtowy blok do bufora, trzymając się tych bufor, te 512 bajtów, dopóki nie wiemy dokładnie to, co do nich. Tak więc początek nie jest coś, więc będziemy czytać bufor, porównać je i nie trzeba będzie nic z nim zrobić. A następnie, w końcu uderzył w gwiazdę zablokować, co oznacza, że ​​mamy że nasz pierwszy JPG. Więc teraz trzymać bufor bajtów z tego JPG. Następnym razem 512 bajtów, ponieważ są one Blok nie gwiazda, są też część tego JPG. I jpgs są ciągłe stamtąd na w, aż trafiliśmy do następnego JPG. A następnie bufor następnie przechowuje 512 bajtów dla tego JPG i tak dalej, i tak dalej. OK. Więc po raz pierwszy wystąpili przebój Blok pierwszy JPG, jak można faktycznie, dobrze, otworzyć go? Zróbmy nowy JPG. Nazwy plików w formacie JPG zamiar być w formacie, liczba, liczba, number.jpg, w które są one nazywane w Kolejność, w jakiej one występują, zaczynając od 0. Tak, że pierwszy JPG 000.jpg będzie znaleźć. Więc chyba dobry pomysł, aby śledzić o ile jpgs znalazłeś do tej pory. Więc to jest nazwa pliku. Ale jak można rzeczywiście zrobić to? Cóż, będziemy korzystać Funkcja o nazwie sprintf. Trochę podobna do printf, gdzie można używać symboli zastępczych na smyczki, wyjątkiem w tym przypadku, będzie sprintf wydrukować Plik się do prądu katalogu, nie do terminala. OK. Więc widzimy, że mamy tytuł, tablica char, która będzie przechowywać Otrzymany ciąg, i mijamy się Tytuł rzeczywistego ciągu z zastępczy, tak jak my Nauczyłam się robić z printf. Ale kod, który mam tutaj da 2.jpg, nie 002.jpg. Więc zostawiam wam, aby dowiedzieć się, jak zmodyfikować symbol zastępczy, aby poprawna nazwa. OK. Więc kiedy już sprintf'd następnie można otwórz ten plik, ponieważ istnieje w katalogiem, z fopen, stosując tytuł, a następnie, co chcesz w trybie aby otworzyć dany plik w. Więc teraz, że mamy otwarty nowy plik JPG, teraz możemy napisać 512 bajtów w czasu, aż nowy JPG znajduje. Warto więc przyjrzeć w składni fwrite. Wiem, że jestem pokazując tę ​​przesunąć dużo, ale po prostu chcę się upewnić, że wy nie zbyt zdezorientowany, ponieważ Wiem, że to jest bardzo łatwe do mieszać się pierwszy i ostatni Argument, w szczególności. Ale pamiętaj, że piszesz z Twój bufor do plików obrazków. Teraz, gdy wiesz, jak napisać 512 bajtów do pliku JPG, które zostały stworzony, dobrze, chcemy zatrzymać, że Proces kiedy już dotarł do końca Nasz karty, ponieważ nie będzie żadnych więcej zdjęć można znaleźć. Więc wróćmy do fread jeszcze raz, obiecuję. fread zwraca liczbę elementów o wielkości, rozmiar, były gotowe w pomyślnie. Idealnie, to będzie co mijamy się na liczby, prawda? Bo próbujesz przeczytać numer Elementy wielkości, rozmiaru. Ale jeśli fread nie jest w stanie odczytać, że liczba elementów, to będzie to powrót bez względu na liczbę czytać pomyślnie. Teraz jedna ważna rzecz, którą należy że jeśli używasz innego pliku I / O Funkcja jak fgetc, będzie to również powrót ile przedmiotów czytać pomyślnie. Co jest przydatne o tej funkcji jest , że w przypadku korzystania z funkcji wewnątrz Stan, będziesz wykonywał się podczas ustalenia, że ​​stan, który jest tylko naprawdę użyteczne. Więc jeśli masz to warunki, powiedzmy, jeśli fread bufor, sizeof pies, 2, wskaźnik, równa jest równa 1, to Oznacza to, że chciałbym, aby przeczytać 2 psy w tym czasie. Ale jeśli fread zwraca 1, a nie 2, jak oczekuje się, że oznacza to, że istnieje 2 Psy pozostawione w moim pliku, ale 1. Ale jeśli zwróci 2, to mam jeszcze te 2 psy wewnątrz mojego buforu. Więc teraz, że daje poczucie, jak sprawdź na końcu pliku, ale idziemy przez obecnie logiki. Jak faktycznie poskładać wszystko te elementy razem? Raz trafiliśmy nasz pierwszy JPG, od wiemy, że jpgs są przechowywane ciągły, będziemy pisać do momentu dotrzemy do końca pliku karty. Ale nie chcę pisać coś do tego czasu. Więc nie ma znaczenia, nie tylko, że jesteśmy w Rozpoczęcie nowego JPG, ale czy my już znaleźliśmy JPG lub nie. Jeśli jest to początek nowej JPG, będziemy chcą zamknąć nasz razie aktualny plik JPG mamy jedno otwarte i otwarty nowy zapis do. Jeśli nie jest to początek nowej JPG, jeśli będziemy utrzymywać ten sam plik JPG otworzyć i dodać do tego. Będziemy pisać nasz bufor w zależności od tego, Plik JPG mamy otwarte, pod warunkiem, że mamy jeden otwarty, oczywiście. Jeśli nie znaleźliśmy nasz pierwszy JPG Jeszcze, nie pisać nic. I proces ten trwa do momentu dotrzeć do końca tej kartotece. I wreszcie, będziemy chcieli, aby Upewnij się, że fclose dowolny Pliki, które zostały fopened. Gdy jesteś wygodne z koncepcje, spojrzeć na niektóre pseudokod, który podaję tutaj. Po pierwsze, chcesz otworzyć plik karty, a następnie powtórz następujący proces dopóki nie osiągnął koniec karty. Chcesz przeczytać 512 bajtów w buforze. Korzystanie z tego bufora, będziemy chcieli, aby sprawdzić czy jesteś na początku Nowy JPG lub nie. A odpowiedź na to pytanie będzie wpływu na zarządzanie plikami - które pliki, które można otworzyć, ci, czy zamknąć. Następnie, czy już znaleźli JPG? Jak się masz utrzymywanie utwór z tego? Następnie, w zależności od, że albo będziesz Napisać do bieżącego JPG że mają otwarte, czy nie napisać go w ogóle, dlatego, że nie znalazłem jeszcze JPG. Wreszcie, gdy już dobiega końca plik, będziemy chcieli, aby zamknąć wszystkie pozostałe pliki, które zostały otwarte. Chcemy być schludne tutaj. A z tym, już odzyskać wszystkie brakujące pliki z tej pamięci Karta, która jest dość niesamowity wyczyn. Więc pat się na plecach. Ale jest jeszcze jeden element, PSET, który jest konkurs. Przekonasz się, że wszystkie zdjęcia które zostały odzyskane są w rzeczywistości zdjęcia pracowników CS50 jest. Więc jeśli jesteś gdzieś na terenie kampusu lub w pobliżu, można robić zdjęcia z personel, a część, która ma większość zdjęć z pracownikami z ich odzyskanych plików będzie uzyskać niesamowite nagrody. Z tym, to jesteś gotowy odzyskać pset. Nazywam się Zamyla, i to jest CS50.