>> [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.