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