GŁOŚNIK: Jak dotąd, jest prawdopodobne, że większość programów były nieco efemeryczne. Uruchomić program jak Mario czy chciwy. To coś robi, to być może poprosi użytkownik z jakiegoś informacji wydrukować jakieś wyjście do ekranu, ale wtedy, gdy program się skończy, tam naprawdę nie ma dowodów kiedykolwiek prowadzono w pierwszej kolejności. To znaczy, na pewno, może masz po lewej stronie go otworzyć w oknie terminala, ale jeśli wyczyścić ekran, nie ma Naprawdę nie ma dowodów na to, że istniał. Nie mamy umożliwiające przechowywanie trwałe informacje, informacje który istnieje po naszym programu zostało zatrzymane, czy nie mamy do tej pory. Na szczęście jednak, c robi Podziel się z nami zdolności to zrobić poprzez wdrożenie coś, co nazywa plik, struktura, która w zasadzie reprezentuje plik, który chcesz podwoić kliknij na komputerze, jeśli jesteś wykorzystywane do graficznego środowiska użytkownika. Generalnie podczas pracy zc, jesteśmy w rzeczywistości będzie pracować z wskaźniki do files-- plik stars-- chyba na trochę kiedy mówimy o parze z funkcji pracować z wskaźniki plików. Nie trzeba się naprawdę wykopał zbyt głęboko do wskaźników zrozumienie sami. Jest trochę malusieńki nieco gdzie będziemy rozmawiać o nich, ale generalnie złożyć wskaźników i wskaźniki, natomiast ze sobą powiązane, nie jest dokładnie to samo. Teraz co mam na myśli, kiedy Mówię trwałe dane? Co to jest trwałe dane? Dlaczego dbamy o tym? Załóżmy na przykład, że używasz programu lub już przepisany Program, że jest to gra, i chcesz śledzić wszystkich ruchów użytkownika tak, że może jeśli coś pójdzie nie tak, można przejrzeć plik po meczu. To, co mamy na myśli mówić o trwałych danych. W trakcie prowadzenia swojej Program tworzony jest plik. A gdy program zatrzymał się pracuje, że plik nadal istnieje w systemie. I możemy spojrzeć na to i zbadać go. I tak, że program byłby ustawiony Stworzyliśmy kilka trwałych danych, istnieją dane po programie zakończy działanie. Teraz wszystkie te funkcje, które działają z tworzenia plików i manipulowania je na różne sposoby Mieszkam w standardowym io.h, który plik jest nagłówek, który masz może być funta w tym na górnej dość znacznie wszystkich programów ponieważ zawiera ona jedną z najbardziej przydatne funkcje dla nas, printf, które również pozwala Mieszka w standardowym io.h. Więc nie trzeba bić to Prawdopodobnie jakieś dodatkowe pliki w celu pracy z wskaźniki plików. Teraz każda funkcja wskaźnik pliku, lub każdy plik I / O, wyjście wejście funkcja przyjmuje jako jeden jego parametrów lub wejść pointer-- plik wyjątkiem dla jednego, fopen, które jest to, czego używać, aby pobrać plik Wskaźnik w pierwszej kolejności. Ale po tym, jak otworzył plik, a otrzymasz wskazówki, plików, można następnie przekazać je jako argumenty do różnych funkcji będziemy mówić o dzisiaj, jak i wielu innych tak, że można pracować z plikami. Więc istnieje sześć całkiem wspólne podstawowe, że będziemy dziś mówić. fopen i jego towarzyszka Funkcja fclose, fgetc i jego funkcja towarzyszem fputc, i fread i jego funkcja towarzyszem, fwrite. Więc przejdźmy od razu do rzeczy. fopen-- co to robi? Cóż, to otwiera plik i daje wskaźnik pliku do niej, tak, że można użyć, że złożyć wskaźnik jako argument któregokolwiek z drugiej funkcje I / O pliku. Najważniejszą rzeczą pamiętać fopen jest, że po otwarty pliku lub wykonane połączenia, jak ten tutaj, należy sprawdzić, aby upewnić się, że wskaźnik, że wróciłeś nie jest równa null. Jeśli nie oglądałem film na wskaźniki, to może nie ma sensu. Ale jeśli spróbujesz i dereference recall null pointer, Twój program będzie prawdopodobnie cierpi segmentacja [niesłyszalne]. Chcemy, aby upewnić się, że ma uzasadniony wskaźnik plecy. Zdecydowana większość czasu będziemy zdobyć uzasadniony wskaźnik powrotem i nie będzie problemu. Jak więc zrobić wywołanie fopen? Wygląda prawie tak. Gwiazda pliku ptr-- ptr jest ogólna nazwę dla pliku pointer-- fopen i przechodzimy w dwóch rzeczy, nazwę pliku i operacja chcemy podjąć. Więc możemy mieć telefon, który wygląda jak this-- gwiazda plik ptr 1 równa fopen plik1.txt. I operacja wybrałem jest r. Więc co sądzisz r jest tutaj? Jakie są rodzaje rzeczy może być w stanie zrobić, aby pliki? Tak więc r jest operacją, że wybrać, gdy chcemy odczytać plik. Więc byłoby w zasadzie, gdy możemy wykonać połączenie tak być coraz sobie wskaźnik pliku takie, że możemy to odczytać informacje z file1.txt. Podobnie, możemy otworzyć pliku 2.txt do pisania, a więc może przejść PTR2, wskaźnik pliku stworzyłem tutaj, jako argument do dowolnej funkcji zapisuje informację do pliku. I podobne do pisania, nie również możliwość dołączania, a. Różnica pomiędzy pisanie i dopisywania jest, że podczas zapisu do pliku, jeśli można dodzwonić się do fopen do pisania i że plik już istnieje, to zamiar zastąpić cały plik. To będzie zacząć na początku usuwanie wszystkich informacji że już tam jest. Natomiast jeśli otworzysz go do dopisywania, będzie go do końca pliku jeśli jest już tekst to czy informacje w nim, i będzie następnie rozpocząć pisanie stamtąd. Więc nie stracisz żadnej z Informacje zrobiłeś wcześniej. Czy chcesz napisać lub dołączyć rodzaj zależy od sytuacji. Ale prawdopodobnie będziesz wiedzieć, co prawo operacja jest, gdy nadejdzie czas. Więc to fopen. Co fclose? Cóż, całkiem po prostu, fclose po prostu akceptuje wskaźnik pliku. I jak można się spodziewać, zamyka ten plik. A kiedy już zamknięty plik, nie możemy Plik wykonywać żadnych więcej Funkcje wejścia / wyjścia, odczytu lub zapisu, na tym pliku. Musimy ponownie otworzyć złożyć kolejny raz, aby do kontynuowania współpracy z wykorzystując funkcje I / O. Oznacza więc fclose skończymy pracy z tego pliku. I wszyscy musimy zdać się jest nazwa wskaźnika pliku. Więc na kilka slajdy temu, fopened plik tekstowy 1 kropka do czytania i przypisane, że wskaźnik do pliku PTR1. Teraz zdecydowaliśmy, że jesteśmy wykonane z czytania tego pliku. Nie musisz robić nic więcej z nim. Możemy po prostu fclose PTR1. I podobnie, możemy fclose pozostałych. W porządku. Więc to jest otwarcie i zamknięcie. Są dwa podstawowe rozpoczęciem pracy. Teraz chcemy, aby rzeczywiście zrobić kilka ciekawych rzeczy, a pierwszą funkcją we''ll zobaczyć, że zrobi to fgetc-- złożyć uzyskać charakter. To, co fgetc ogólnie przełoży się. Jego celem w życiu jest czytaj następny znak, lub jeśli jest to twój bardzo Pierwsze połączenie fgetc dla określonego pliku, pierwszy znak. Ale po tym, pojawi się następny, już następnego znak tego pliku, i zapisuje ją w zmiennej charakter. Jak robiliśmy tutaj, char ch równa fgetc, przekazać w imię wskaźnika pliku. Ponownie, jest to bardzo Ważne, żeby pamiętać, że w celu uzyskania ta operacja się uda, sam wskaźnik pliku musiało zostały otwarte do czytania. Nie możemy odczytać znak z pliku wskaźnik, który otworzyliśmy w formie pisemnej. Jest to więc jeden z Ograniczenia fopen, prawda? Musimy ograniczyć się tylko do wykonywania jedna operacja z jednego wskaźnika pliku. Gdybyśmy chcieli czytać i Napisać z tego samego pliku, będziemy mieć otwarte dwa oddzielne wskaźniki plik do tego samego file-- jeden do czytania, jeden do pisania. Więc jeszcze raz, tylko dlatego, Przynoszę, że się jest bo jeśli mamy zamiar wykonać połączenie fgetc, że wskaźnik pliku musiało zostały otwarte do czytania. A potem całkiem po prostu, Wszystko, co trzeba zrobić, jest przekazać w imię wskaźnika pliku. Więc char ch równa fgetc PTR1. Że będzie się nas następny character-- Lub też, jeżeli jest to pierwszy razem zrobiliśmy to wezwanie, pierwszy character-- niezależnie Plik jest wskazywany przez PTR1. Przypomnijmy, że to był plik 1 kropka tekst. Będzie się pierwszy znak, że a my go przechowywać w zmiennej ch. Całkiem proste. Więc my spojrzał tylko na trzech funkcje i już mamy Można zrobić coś całkiem zgrabny. Więc jeśli weźmiemy tę zdolność na uzyskanie znaku i pętla it-- więc nadal się znaki z pliku nad i nad i over-- teraz może czytać każdy postać pliku. A jeśli wydrukować każdy znak natychmiast po go przeczytać, mamy teraz czytać z pliku i drukowane jego zawartość na ekranie. Mamy skutecznie łączone ten plik na ekranie. I to jest to, co Linux polecenie kot robi. Jeśli wpiszesz kota w nazwie pliku go, wydrukuje całą zawartość pliku w oknie terminala. I tak ta mała pętla tutaj, tylko trzy linie kodu, ale skutecznie powiela Polecenie cat Linux. Więc ta składnia może wygląda trochę dziwnie, ale oto co się tutaj dzieje. Podczas ch równa fgetc, ptr nie jest równa EOF-- to cała kupa, ale niech rozbicie go po prostu więc jest jasne, na składni. Mam skonsolidowane go ze względu na przestrzeń choć jest to trochę składniowo trudne. Tak więc ta część w zielonej prawo teraz, co on robi? Dobrze, że to właśnie nasze wezwanie fgetc, prawda? Widzieliśmy, że przed. To uzyskania jednego znaków z pliku. Następnie porównujemy, że znak przed EOF. EOF jest szczególną wartością, która jest zdefiniowano w standardzie io.h, która jest znak końca pliku. Więc w zasadzie to, co się wydarzy jest to pętla będzie czytać charakter, porównać go do wartość EOF, znak końca pliku. Jeśli nie pasują, więc nie mamy osiągnął koniec pliku, będziemy drukować ten znak na zewnątrz. Potem wrócimy do początku pętli ponownie. Dostaniemy znak, sprawdzić przeciwko EOF, wydrukować, i tak dalej i tak dalej, i tak dalej, krążący w ten sposób dopóki nie dotarł do końca pliku. A następnie w tym momencie, będziemy wydrukowaniu z całej zawartości pliku. Więc jeszcze raz, mamy tylko widziałem fopen, fclose i fgetc i już możemy powielić terminal poleceń Linuksa. Jak powiedziałem na początku, mieliśmy fgetc i fputc, i fputc był towarzyszem Funkcja fgetc. I tak, jak pan może sobie wyobrazić, jest to równoważne pisania. To pozwala nam napisać pojedynczy znak do pliku. Ponownie, zastrzeżenie jest, po prostu jak to było z fgetc plik że piszemy do musiało być otwarty na piśmie lub do dopisywania. Jeśli spróbujemy i używać fputc na pliku że mamy otwarte do czytania, będziemy cierpieć trochę pomyłkę. Ale rozmowa jest dość prosta. Kapitał fputc PTR2 wszystko że zamierza zrobić, to jest to zamiar napisać list do do pliku 2 kropki Tekst, który się nazywał z plik, który otworzyliśmy i przypisany wskaźnik do PTR2. Tak więc mamy zamiar napisać Kapitał A do pliku 2 dot tekst. I będziemy pisać okrzyk wskazać plik 3 kropkę Tekst, który był wskazywany przez ptr3. Więc jeszcze raz, całkiem proste tutaj. Ale teraz możemy zrobić coś innego. Mamy ten przykład byliśmy po prostu się nad o jest w stanie replikować kota Komenda Linux, który wypisuje na ekranie. Dobrze, że teraz mamy możliwość odczytać znaki z plików i pisania znaków w plikach, dlaczego nie możemy po prostu zastąpić że zadzwonić do printf z wezwaniem do fputc. A teraz mamy powielane cp, bardzo prosty poleceń Linuksa że rozmawialiśmy o tak długo, temu w Linuksie Polecenia wideo. Skutecznie mam powielane, że właśnie tutaj. Jesteśmy czytania znaku, a następnie jesteśmy pisząc tę ​​postać do innego pliku. Czytanie z jednego pliku, pisanie do drugiego, kółko i znowu, aż trafiliśmy EOF. Mamy do końca plik chcemy skopiować z. I że będziemy pisali wszystkie znaków musimy pliku że jesteśmy piśmie. Więc to jest cp, polecenie copy Linux. Na samym początku Ten film, miałem zastrzeżenie że chcemy porozmawiać Trochę o wskazówki. Oto specjalnie gdzie jesteśmy będziemy mówić o wskazówki w uzupełnieniu do pliku wskazówek. Tak więc funkcja ta wygląda trochę przerażające. Jest tam kilka parametrów. Jest dużo się tu dzieje. Istnieje wiele różnych kolory i tekstów. Ale tak naprawdę, to tylko generic wersja fgetc która pozwala nam uzyskać dowolny ilość informacji. To może być nieco nieefektywne, jeśli będziemy coraz znaki, w czasie, iteracja pliku jeden znak na raz. Czy nie byłoby przyjemniej się 100 w czasie, lub 500 w czasie? Cóż, fread i jego funkcja towarzyszem fwrite, które będziemy rozmawiać o w drugim, pozwala nam nie tylko to. Możemy przeczytać dowolną ilość informacji z pliku i przechowywać go gdzieś tymczasowo. Zamiast być w stanie po prostu zmieścił się w pojedynczej zmiennej, Może trzeba przechowywać go w tablicy. I tak, mijamy w czterech argumenty fread-- wskaźnik w miejscu, w którym jesteśmy będzie do przechowywania informacji, jak duży każda jednostka informacji będzie, ile jednostek informacji chcemy nabyć, a od który plik chcemy je zdobyć. Prawdopodobnie najlepiej ilustruje o przykład. Więc powiedzmy, że deklarujemy tablica z 10 liczb. Właśnie ogłosił na układać dowolnie int arr 10. Więc to jest bardzo proste. Teraz to, co robimy jest jednak frecall jest czytamy rozmiar int razy 10 bajtów informacji. Rozmiar int istoty four-- to wielkość całkowitą w c. Więc to, co robimy jest czytamy 40 bajtów o wartości informacji z pliku wskazywanego przez ptr. A my przechowywania tych 40 bajtów gdzieś gdzie uchylenie 40 bajtów o wartości pamięci. Na szczęście mamy już zrobione, że oświadczając, arr, że tablica tam. Że jest w stanie utrzymać 10 jednostek czterech bajtów. Tak więc w sumie może pomieścić 40 bajtów warte informacji. I teraz czyta 40 bajtów informacji z pliku, a my przechowywania go w opr. Przypomnijmy, od wideo na wskaźników, które nazwa tablicy, takich jak ARR, jest tak naprawdę wskaźnik na pierwszym elemencie. Więc, kiedy mijamy w arr tam, są w rzeczywistości, przekazując wskaźnika. Podobnie możemy zrobić this-- Niekoniecznie należy zapisać naszą bufora na stosie. Mogliśmy również dynamicznie przydzielać Bufor ten sposób, za pomocą malloc. Pamiętaj, kiedy dynamicznie przydzielać pamięć, jesteśmy zapisanie go na kupa, nie stos. Ale to jeszcze bufor. Nadal w tym przypadku jest posiadający 640 bajtów informacji bo podwójne zajmuje osiem bajtów. A my z prośbą o 80 z nich. Chcemy mieć miejsca trzymać 80 dwuosobowych. Tak więc 80 razy 8 to informacja 640 bajtów. I że wezwanie do fread jest zbierając 640 bajtów informacji z pliku wskazanego przez ptr i przechowywania go teraz w ARR2. Teraz możemy również traktować fread jak wezwanie do fgetc. W tym przypadku, po prostu próbuje się jeden znak z pliku. A my nie potrzebujesz tablica trzymać znak. Możemy po prostu zapisać je w zmienny charakter. Połów jest jednak to, że kiedy po prostu zmienną, musimy przejść w adres tej zmiennej bo Przypomnijmy, że Pierwszym argumentem fread jest wskaźnik do lokalizacji i pamięci gdzie chcemy przechowywać informacje. Ponownie, nazwą Tablica jest wskaźnikiem. Więc nie musimy robić ampersand tablicę. Ale c, znak c tutaj, nie jest tablicą. To jest po prostu zmienna. A więc musimy zdać znaku & c, aby wskazać, że jest to adres, pod którym chcemy aby zapisać ten jeden bajt informacji, ten znak, który mamy do zbierania od ptr. Fwrite-- Pójdę przez to trochę więcej quickly-- jest dość dużo Dokładny odpowiednik fread tylko, że to na piśmie zamiast czytania, po prostu jakby other-- mieliśmy otwarte i blisko, uzyskać znak, napisać znak. Teraz to się arbitralne Ilość informacji, prawo dowolna ilość informacji. Tak jak poprzednio, możemy mają tablicę 10 liczb całkowitych gdzie już mamy informacje przechowywane, być może. To było prawdopodobnie niektóre linie kodu które powinny przejść między tymi dwoma gdzie mogę wypełnić arr z coś znaczącego. I wypełnić go z 10 różnych liczb całkowitych. A zamiast tego, co mam robi pisze z ARR i zebranie informacji z ARR. A ja biorę tę informację i wprowadzenie go do pliku. Więc zamiast to istota z plik do bufora, jesteśmy teraz będzie z bufor do pliku. Więc to tylko odwrotnie. Więc znowu, podobnie jak poprzednio, możemy też kawał sterty pamięci że mamy dynamicznie alokowane i czytać, że i pisać, że do pliku. I mamy także jedną zmienną w stanie utrzymać jeden bajt informacji, takich jak charakter. Ale znowu, musimy zdać się adres tej zmiennej gdy chcemy odczytać z niego. Tak więc możemy napisać informacje znaleźć pod tym adresem do wskaźnika pliku, ptr. Jest wiele innych wspaniały plik / funkcje O robić różne rzeczy, że oprócz te, rozmawialiśmy o dniu dzisiejszym. Kilka z tych, może się okazać przydatna są fgets i fputs, które są odpowiednikiem z fgetc i fputc ale do czytania jeden ciąg z pliku. Zamiast pojedynczego znaku, będzie przeczytać cały ciąg. fprintf, co pozwala w zasadzie korzystanie printf, aby zapisać do pliku. Więc jak można wykonać Podstawienie zmiennej za pomocą Symbole zastępcze procent i oraz procent d, i tak dalej, z printf Podobnie można podjąć ciąg printf i drukowania coś tak pliku. fseek-- jeśli masz odtwarzacz DVD jest analogia Zwykle używam here-- jest trochę jak za pomocą swojego do tyłu i do przodu przyciski do poruszania się wokół filmu. Podobnie, można poruszać się w pliku. Jedną z rzeczy wewnątrz że struktura pliku że c tworzy dla Ciebie jest wskaźnikiem od tego, gdzie jesteś w pliku. Czy jesteś na samym poczynając, na bajt zerowy? Czy jesteś na bajt 100, Bajt +1.000, i tak dalej? Możesz użyć fseek arbitralnie przenieść że wskaźnik przodu lub do tyłu. I ftell, ponownie podobna do odtwarzacza DVD, jest jak mały zegar, który mówi Ci, ile minut i sekund, są w szczególności filmu. Podobnie, ftell mówi, jak wiele bajtów jesteś do pliku. feof jest inna wersja wykrywania, czy masz osiągnięciu końca pliku. I ferror jest funkcją że można użyć w celu wykrycia, czy coś ma Gone Wrong pracy z plikiem. Ponownie, jest to po prostu zarysowania powierzchni. Jest jeszcze wiele więcej plików I / O Funkcje w standardowym io.h. Ale będzie to prawdopodobnie ci rozpoczął pracę ze wskaźnikami plików. Jestem Doug Lloyd. To CS50.