[Powered by Google Translate] [Plik I / O] [Jason Hirschhorn, Harvard University] [To jest CS50, CS50.TV] Kiedy myślimy o pliku, co przychodzi do głowy to dokument Microsoft Word, obraz JPEG lub MP3 song, i współdziałają z każdym z tych typów plików na różne sposoby. Na przykład, w dokumencie programu Word możemy dodać tekst podczas gdy z obrazu JPEG możemy przyciąć się krawędzie lub retuszować kolory. Jednak pod maską wszystkie pliki w naszym komputerze nie są niczym więcej niż długi ciąg zer i jedynek. To jest do konkretnego zastosowania, który współdziała z plikiem zdecydować, jak przetworzyć ten długiej sekwencji i przedstawić go do użytkownika. Z jednej strony, dokument może spojrzeć na jednym bajcie, lub 8 zer i jedynek, a wyświetlanie znaków ASCII na ekranie. Z drugiej strony, może wyglądać bitmapy w 3 bajtów lub 24 zer i jedynek, i interpretować je jako 3 liczb szesnastkowych które reprezentują wartości dla koloru czerwonego, zielonego i niebieskiego jednego piksela obrazu. Cokolwiek oni wyglądają na ekranie, na ich rdzenia, Pliki nie są niczym więcej niż ciąg zer i jedynek. Więc zanurkować i patrzeć na to, jak rzeczywiście manipulować zer i jedynek jeśli chodzi o piśmie i odczytu z pliku. Zacznę od podziału go do prostego 3-część procesu. Następnie będę nurkować na dwa przykłady kodu, które wykażą te trzy części. Wreszcie będę przeglądu procesu, a niektóre z jego szczegółami najważniejszych. Jak w przypadku każdego pliku, który znajduje się na pulpicie, Pierwszą rzeczą do zrobienia jest, aby go otworzyć. W C to zrobić deklarując wskaźnik do predefiniowanej struktury że reprezentuje plik na dysku. W tym wywołaniu funkcji, możemy także zdecydować, czy chcemy napisać lub odczytać pliku. Dalej, mamy rzeczywisty czytania i pisania. Istnieje wiele specjalizowanych funkcji można stosować w tej części, i prawie wszystkie z nich zaczynają się od litery F, co oznacza plik. Ostatnia, zbliżona do The Little Red X w górnym rogu pliki otworzyć na komputerze, zamykamy plik z ostatnim wywołaniu funkcji. Teraz, gdy mamy ogólne pojęcie o tym, co będziemy robić, niech nurkować do kodu. W tym katalogu mamy dwa pliki C i odpowiadające im pliki wykonywalne. Program typewriter przyjmuje jeden argument wiersza poleceń, Nazwa dokumentu chcemy stworzyć. W tym przypadku, będziemy nazywać Doc.txt. Załóżmy, uruchomić program i wprowadzić kilka linii. Hi. Nazywam się Jason. Wreszcie będziemy wpisz "quit". Jeśli teraz listę wszystkich plików w tym katalogu, widzimy, że nowy dokument istnieje nazywa Doc.txt. To plik ten program po prostu stworzony. I oczywiście, to też nie jest niczym więcej niż długi ciąg zer i jedynek. Jeśli otworzyć nowy plik, możemy zobaczyć 3 linie kodu weszliśmy do naszego programu - Hi. Nazwa maja jest Jason. Ale co się właściwie dzieje, gdy typewriter.c działa? Pierwsza linia interesujące dla nas jest linia 24. W tym wierszu deklarujemy wskaźnik pliku. Funkcja, która zwraca ten wskaźnik, fopen, pobiera dwa argumenty. Pierwszy to nazwa pliku wraz z rozszerzeniem pliku, jeśli to właściwe. Przypomnijmy, że rozszerzenie pliku nie ma wpływu na plik na najniższym poziomie. Mamy zawsze do czynienia z długą sekwencję zer i jedynek. Ale ma wpływ na to jak pliki są interpretowane i jakie aplikacje są wykorzystywane do ich otwierania. Drugi argument funkcji fopen jest jedna litera , która stoi za to, co mamy zamiar robić po to otwieramy plik. Istnieją trzy opcje dla tego argumentu - W, R, A. Wybraliśmy W w tym przypadku, ponieważ chcemy zapisać do pliku. R, jak można się domyślić, jest do odczytu w pliku. I jest dodanie do pliku. Chociaż zarówno w i mogą być stosowane do zapisu plików W rozpocznie pisania z początku pliku i potencjalnie zastąpić wszystkie dane, które zostały wcześniej zapisane. Domyślnie plik możemy otworzyć, jeśli nie istnieje, tworzona jest w naszym obecnym katalogu. Jednakże, jeśli chcemy uzyskać dostęp lub utworzyć plik w innym miejscu, w pierwszym argumencie fopen, możemy określić ścieżkę do pliku, w dodatku do nazwy pliku. A pierwsza część tego procesu jest tylko jedna linia kodu długi zawsze jest dobrą praktyką jest inny zestaw wierszy że sprawdzić, czy plik został pomyślnie otwarty lub utworzony. Jeśli fopen zwraca wartość NULL, nie chcemy, aby posunąć się naprzód z naszego programu, a to może się zdarzyć, jeśli system operacyjny to z pamięci lub jeśli spróbujesz otworzyć plik w katalogu, dla których nie mają odpowiednich uprawnień. Druga część procesu odbywa się w maszyny do pisania pętli. Używamy CS50 funkcji biblioteki, aby uzyskać danych od użytkownika, i przy założeniu, że nie chcą, aby zakończyć program, używamy funkcji fputs podjąć ciąg i zapisać go do pliku. fputs jest tylko jedną z wielu funkcji możemy użyć zapisu do pliku. Inne obejmują fwrite, fputc, a nawet fprintf. Niezależnie od tego, w szczególności funkcji skończymy stosując jednak wszyscy muszą wiedzieć, za pośrednictwem swoich argumentów, przynajmniej dwie - co powinno być napisane i gdzie musi być napisana na. W naszym przypadku wejście jest łańcuch, który musi być napisany i fp jest wskaźnik, który kieruje nas do miejsca, gdzie piszemy. W tym programie, druga część procesu jest raczej proste. Jesteśmy po prostu biorąc ciąg od użytkownika i dodając go bezpośrednio do naszego pliku z mało-to-nie walidacji wejścia lub kontroli bezpieczeństwa. Często jednak druga część odbędzie się na większą część swojego kodu. Wreszcie część trzecia jest na linii 58, gdzie zamknij plik. Tutaj nazywamy fclose i przekazać nasz oryginalny wskaźnik pliku. W następnej linii, zwracamy zero oznaczało koniec naszego programu. I tak, część trzecia jest tak proste. Przejdźmy do czytania z plików. Powrót w naszym katalogu mamy plik o nazwie printer.c. Przyjrzyjmy się jej z pliku stworzonego właśnie - Doc.txt. Program ten, jak nazwa wskazuje, będzie po prostu wydrukować zawartość pliku przekazany do niej. I tam mamy. Linie kodu mieliśmy wpisane wcześniej i zapisane w Doc.txt. Hi. Nazywam się Jason. Jeśli zagłębimy się printer.c, widzimy, że większość kodu wygląda podobnie do tego, co po prostu szliśmy przez w typewriter.c. Rzeczywiście linia 22, gdzie otworzył plik, i linii 39, gdzie zamknięty plik, oba niemal identyczne typewriter.c, z wyjątkiem fopen drugi argument. Tym razem mamy do odczytu z pliku, więc wybraliśmy R zamiast w. Tak więc, skupmy na drugiej części procesu. W linii 35, jak w drugim stanie naszego 4 pętli możemy wykonać połączenie do fgets, Funkcja towarzysz fputs sprzed. Tym razem mamy trzy argumenty. Pierwszy to wskaźnik do tablicy znaków gdzie ciąg zostanie zapisany. Drugi jest maksymalna liczba znaków do odczytu. A trzeci jest wskaźnik do pliku, z którymi pracujemy. Można zauważyć, że dla pętli kończy się, gdy fgets zwraca null. Istnieją dwa powodu, że może mieć miejsce. Po pierwsze, mógł wystąpić błąd. Po drugie, i co bardziej prawdopodobne, koniec pliku został osiągnięty i kolejne znaki nie były odczytywane. W przypadku, gdy zastanawiasz się, istnieją dwie funkcje, które pozwalają nam powiedzieć dlatego jest przyczyną tego konkretnego wskaźnika zerowego. I nic dziwnego, gdyż mamy do czynienia z pracy z plikami, zarówno ferror funkcja i funkcja start feof z literą F. Wreszcie, przed stwierdzić, jedna krótka notatka o zakończeniu funkcji pliku, , które, jak już wspomniano, jest napisane jak feof. Często znajdziesz się przy użyciu while i pętli do stopniowego zapoznania się przez pliki. Tak więc, trzeba mieć sposób na zakończenie te pętle po dojdziesz do końca z tych plików. Wywołanie feof na wskaźnika pliku i sprawdzamy, czy to prawda będzie nie tylko to. Tak więc, podczas gdy pętla z warunkiem (! Feof (fp)) może wydawać się rozwiązaniem idealnie odpowiedni. Jednak, że mamy jedną linię w lewo, w naszym pliku tekstowym. Będziemy wejść na naszą pętlę while i wszystko ułoży się zgodnie z planem. Na następnej rundzie przez nasz program będzie sprawdzić czy feof z fp jest prawdziwe, ale - i to jest kluczowy punkt do zrozumienia tutaj - to nie będzie prawda jeszcze. To dlatego, że celem nie jest feof sprawdzić jeśli następne wywołanie funkcji read trafi na koniec pliku, lecz sprawdzić, czy koniec pliku został osiągnięty. W przypadku tego przykładu czytając ostatnią linię naszego pliku idzie idealnie gładko, ale program nie wie jeszcze, że został trafiony koniec naszego pliku. To nie jest aż robi jedną dodatkową lekturę, że liczniki na koniec pliku. Dlatego prawidłowy stan byłyby następujące: fgets i jej trzy argumenty - wyjście, wielkość produkcji i FP - i wszystko to nie jest równa null. Jest to podejście wzięliśmy printer.c, w tym przypadku, po wyjściu pętli, można nazwać feof lub ferror poinformować użytkownika co do konkretnego uzasadnienia dla zamykania tej pętli. Zapis do i odczyt z pliku jest w jego najbardziej podstawowym, prosty 3-częściowy proces. Po pierwsze, musimy otworzyć plik. Po drugie, musimy umieścić kilka rzeczy do naszego pliku lub wybrać kilka rzeczy z niego. Po trzecie, zamknij plik. Pierwszy i ostatni części są proste. W środkowej części, gdzie jest trudne rzeczy leży. I chociaż pod maską mamy zawsze do czynienia z długą sekwencję zer i jedynek, to nie pomaga podczas kodowania, aby dodać warstwę abstrakcji który włącza sekwencję w coś bardziej przypomina to, co jesteśmy przyzwyczajeni do zobaczenia. Na przykład, jeśli pracujemy z 24-bitowego pliku bitmapy będziemy prawdopodobnie czytanie lub pisanie trzy bajty na raz. W takim przypadku, warto byłoby określić i odpowiednio nazwać struct to 3 bajty duże. Choć praca z plikami może wydawać się skomplikowane, ich stosowania pozwala nam zrobić coś naprawdę niezwykłego. Możemy zmienić stan świata poza naszym programie możemy stworzyć coś, co żyje poza życia naszego programu, lub może nawet coś zmienić, który został utworzony przed nasz program uruchomić. Interakcja z plików jest naprawdę potężny częścią programowania w C. i jestem podekscytowany, aby zobaczyć, co masz zamiar stworzyć z nim w kodzie przyjść. Nazywam się Jason Hirschhorn. To CS50. [CS50.TV] [Śmiech] Okay. One podjąć. Jedziemy. Kiedy myślimy o pliku - >> Och, czekaj. Przepraszam. [Śmiech] Okay. Cześć. Kiedy myślimy o pliku - Kiedy myślisz o pliku - Okay. Powiedz mi, kiedy będziesz gotowy. Świetnie. Choć czytanie z teleprompter może wydawać - nie. My bad.