>> Pranešėjas: Iki šiol, tai tikėtina, kad dauguma iš jūsų programų
buvo šiek tiek efemeriška.
Jūs paleisti kaip Mario ar gobšus programą.
Tai daro kažką, tai gal paragina dėl kokios nors informacijos vartotojas,
spausdinti tam tikrą produkciją į ekraną, bet tada, kai jūsų programa baigėsi,
ten tikrai nėra įrodymų, kad jis buvo kada paleisti į pirmąją vietą.
Aš turiu galvoje, tikrai, galite nepaliko ji atidaryti terminalo langą,
bet jei išvalyti ekraną, ten tikrai jokių įrodymų, kad jis egzistavo.
Neturime, laikymo priemones patvari informacija, informacija
kad egzistuoja po mūsų programa nustojo veikti,
ar mes ne iki šio taško.
Laimei, nors c ar teikia mums galimybę
tai padaryti įgyvendinant kažkas vadinamas
failas, struktūra, kuri iš esmės atstovauja failą, kad jums būtų dvigubai
spustelėkite ant jūsų kompiuterio, jei esate naudojamas grafinę vartotojo aplinką.
Paprastai, kai darbo su C, mes iš tikrųjų
bus dirbti su Pointeriai files-- failą stars--
išskyrus trupučiu kai kalbame apie pora
funkcijų, kad dirbti su failų rodykles.
Jums nereikia turėti tikrai iškasti per giliai į supratimo patarimų
patys.
Yra šiek tiek smulkutis šiek tiek kur mes kalbame apie juos,
bet apskritai pateikti patarimų ir rodykles, o tarpusavyje,
yra ne visai tas pats dalykas.
>> Dabar ką aš turiu galvoje, kai Sakau nuolatinius duomenis?
Kas yra nuolatiniai duomenys?
Kodėl mums rūpi tai?
Pasakyti, kad, pavyzdžiui, vykdote programą
ar jūs perrašyti programa, kuri yra žaidimas,
ir norite sekti Visų į vartotojo juda
taip, kad gal jei kažkas negerai, galite peržiūrėti Po žaidimo failą.
Štai ką mes turime omenyje, kai mes kalbėti apie nuolatinius duomenis.
>> Jei veikia žinoma, jūsų programa, failas yra sukurta.
Ir kai jūsų programa nustojo veikti,
kad byla vis dar egzistuoja jūsų sistemoje.
Ir mes galime pažvelgti į jį ir jį išnagrinėti.
Ir taip, kad programa būtų nustatytas sukūrė keletą nuolatinių duomenis,
duomenys egzistuoja pasibaigus programai baigė veikia.
>> Dabar visi iš šių funkcijų, kurios dirba su failų kūrimo ir manipuliuoti
juos įvairiais būdais gyvena standartiniame io.h,
kuris yra galva failas, jūs greičiausiai buvo svaras
tame tarpe ir gana viršuje kiek visi jūsų programas
nes jame yra vienas iš Naudingiausi funkcijos mums
printf, kad taip pat leidžia gyvena standartinį io.h.
Taigi jums nereikia svaras yra visi papildomi failai tikriausiai
siekiant dirbti su failų rodykles.
>> Dabar kiekvieną failą žymeklis funkcija, arba kiekvieną failą I / O, įvesties ir išvesties
funkciją, priima kaip vienas jos parametrus ar sąnaudų
failas pointer-- išskyrus vieną, fopen, kuris
yra tai, ką jūs naudojate gauti failą žymeklis į pirmąją vietą.
Bet kai jūs atidaryta failą ir gausite failų patarimų,
tada galite perduoti juos kaip argumentai įvairių funkcijų
mes ketiname kalbėti apie šiandien, taip pat daugelis kitų
taip, kad jūs galite dirbti su failais.
>> Taigi yra šeši gana bendrieji pagrindiniai tie,
kad mes ketiname kalbėti apie šiandien.
fopen ir jos kompanionas funkcija fclose, fgetc
ir jos kompanionas funkcija fputc, ir fread ir jos kompanionas funkcija,
fwrite.
Taigi galime gauti tiesiai į jį.
>> fopen-- ką jis daro?
Na, tai atidaro failą ir jį suteikia jums failo žymiklį į jį,
kad tada galite naudoti, kad failo rodyklės kaip argumentą
bet kita bylos I / O funkcijos.
Svarbiausia prisiminti su fopen
yra tai, kad po to, kai atidarytas byla arba pagaminti kaip vieną skambutį čia
jums reikia įsitikinkite, kad kad žymeklis, kad jūs turite grįžti
nėra lygus nuliui.
Jei neturite stebėjo ant vaizdo patarimų, tai gali prasmės.
Bet jei pabandyti ir dereference null pointer Prisiminkite,
jūsų programa tikriausiai patirs segmentacijos [nesigirdi].
Mes norime įsitikinti, kad mes gavo teisėtą rodyklę atgal.
Dauguma laiko mes Dotarłeś teisėtą žymeklį atgal
ir ji negali būti problema.
>> Taigi, kaip mes Paskambinkite fopen?
Tai atrodo gana daug, kaip šis.
Failo žvaigždė ptr-- PTR yra bendrinis pavadinimas failui pointer-- fopen
ir mes pereiname iš dviejų dalykų, failo pavadinimą ir operacija norime atlikti.
Taigi mes galime turėti skambutį, kad atrodo this-- failą žvaigždė PTR 1 lygu fopen
file1.txt.
Ir operacija aš pasirinkta r.
>> Taigi, ką jūs manote r čia?
Kokie rūšių dalykų mes galėtų daryti failus?
Taigi r operacija, kad mes pasirinkti, kada mes norime skaityti failą.
Taigi mes norėtume iš esmės, kai mes kaip šis skambutį
reikia gauti sau failo žymiklį taip, kad galėtume perskaityti informaciją
nuo file1.txt.
>> Be to, mes galime atidaryti failo 2.txt rašyti ir todėl mes galime perduoti ptr2,
failas žymeklis aš čia sukurta, kaip į bet kokią funkciją argumentą, kad
rašo informaciją į failą.
Ir panašus į raštu, yra taip pat galimybė pridėti, a.
Skirtumas tarp raštu ir papildymo
yra ta, kad kai rašote į failą, jei skambinate į fopen rašymui
ir kad failas jau egzistuoja, tai ketina perrašyti visą failą.
Jis ketina pradėti pačioje pradžioje,
išbraukiant visą informaciją tai jau ten.
>> Kadangi jei atidarote jį pridedant, jis bus eiti į failo pabaigą
jei ten jau tekstas tai ar jame pateikta informacija,
ir jis bus tada pradėti raštu iš ten.
Taigi, jūs ne prarasti bet kurį iš informacija baigsite anksčiau.
Nesvarbu, ar jūs norite rašyti arba pridėti rūšiuoti, priklauso nuo situacijos.
Bet jūs tikriausiai žinote, ką teisė operacija, kai ateis laikas.
Štai fopen.
>> Ką apie fclose?
Na, gana paprasta, fclose tik priima failo rodyklės.
Ir kaip galima tikėtis, jis užbaigia bylą.
Ir kai mes uždarytas failą, mes negalime atlikti bet daugiau failą I / O funkcijos
skaityti arba rašyti, dėl šios bylos.
Turime iš naujo atidaryti pateikti kitą kartą, kad
toliau dirbti su jį naudojant I / O funkcijas.
Taigi fclose reiškia, kad mes baigsime dirbti su šiuo failo.
Ir visi mes turime praeiti yra iš failo žymiklį pavadinimą.
Tad pora skaidres prieš, mes fopened failą 1 taškas teksto skaitymo
ir mes priskirti, kad byla žymiklį ptr1.
Dabar mes nusprendėme mes padaryta skaityti iš šio failo.
Mums nereikia daryti, bet daugiau su juo.
Mes galime tik fclose ptr1.
Ir panašiai, galėtų mums fclose kitus tie.
Gerai.
Taigi, kad atidarymo ir uždarymo.
Tie, yra du pagrindiniai pradedant operacijas.
>> Dabar mes norime iš tikrųjų padaryti įdomių dalykų,
ir pirmoji funkcija, kuri mes matyti, kad darys tai fgetc--
file gauti charakterį.
Štai ką fgetc paprastai būtų išversti į.
Jos tikslas gyvenime yra skaityti kitą simbolį,
arba jei tai yra jūsų labai Pirmasis kvietimas fgetc
už tam tikrą failą, pirmasis simbolis.
Bet tada po to, jūs gaunate kitą vieną,
jau kitą pobūdis tą bylą, ir saugo jį simbolių kintamąjį.
Kaip mes padarėme čia char CH lygus fgetc,
pereiti į failo žymiklį vardu.
Vėlgi, tai labai Svarbu čia prisiminti
kad siekiant turėti ši operacija pavyks,
Pats failas žymeklis must've buvo atidarytas svarstymą.
Mes negalime skaityti simbolį iš failo žymeklis, kad mes atidarėme rašymui.
Štai vienas iš apribojimai fopen, tiesa?
Mes turime apriboti save tik atliekant
vienos operacijos su vienu failo rodyklę.
Jei mes norėjome skaityti ir rašyti iš to paties failo,
mes turėtume atidaryti du atskiri failų rodykles į tą pačią file--
vienas skaityti, po vieną raštu.
>> Taigi dar kartą, vienintelė priežastis Atnešu, kad iki šiol yra
nes jei mes ketiname skambinti į fgetc, kad failas žymeklis must've
buvo atidarytas svarstymą.
Ir tada gana paprastai, visi mes turime daryti
yra perduoti į failo žymiklį vardu.
Taigi char CH lygus fgetc ptr1.
>> Štai ketinate gauti su mumis Kitas character--
arba dar kartą, jei tai yra pirmasis laikas mes padarėme šį kvietimą,
pirmasis character-- bet kokio failas yra nurodomas ptr1.
Prisiminkite, kad tai buvo failas 1 taškas tekstas.
Tai gausite pirmąjį požymį, kad ir mes laikyti jį kintamojo ch.
Gana paprasta.
Taigi mes tik pažvelgė trijų funkcijos ir jau mes
galime padaryti kažką gana tvarkingas.
>> Taigi, jei mes priimsime šį gebėjimą gauti simbolį
ir mes kilpa it-- todėl mes toliau gauti simboliai
iš failo daugiau ir daugiau ir over-- dabar mes
gali skaityti kiekvienas požymis failą.
Ir jei mes spausdinti kiekvieną simbolį iš karto, kai mes jį perskaityti,
mes dabar skaityti iš failo ir spausdinami jos turinį į ekraną.
Mes efektyviai sujungiamos kad failas ekrane.
Ir tai, ką "Linux" komanda cat daro.
>> Jei įvesite Katė failo vardą, tai bus išspausdinti visą turinį
iš savo terminalo lange failą.
Ir taip šis mažas kilpa čia tik trys eilutės kodas,
bet ji veiksmingai dublikatai Linux komanda cat.
Taigi tai sintaksė galėtų atrodo šiek tiek keistai,
bet čia tai, kas vyksta čia.
Nors CH lygus fgetc, PTR nėra lygus EOF-- tai visai kąsnis,
bet tegul ją padalyti tik todėl aišku, sintaksę.
Aš konsoliduoti ją už erdvėje sumetimais,
nors tai šiek tiek sintaksiškai sudėtinga.
>> Taigi ši dalis žalia dešinėje Dabar, kas jis daro?
Na, tai tik mūsų fgetc skambutis, tiesa?
Mes matėme, kad prieš.
Tai gauti vieną personažas iš bylos.
Tada mes lyginame charakteris prieš EOF.
EOF yra speciali vertė tai apibrėžta standarte io.h, kuris
yra failo charakterio pabaiga.
Taigi, iš esmės, kas nutiks Ar tai kilpa bus skaityti simbolį,
palyginti ją su EOF, The failo pabaiga pobūdžio.
Jei jie nesutampa, todėl mes turime ne pasiekė failo pabaigą,
mes spausdinti šį pobūdžio.
Tada mes grįžti į vėl pradeda kilpos.
Mes gausite simbolį, patikrinkite prieš EOF, atspausdinti jį, ir tt
ir taip toliau, ir taip toliau, kilpų per, kad tokiu būdu
kol mes pasiekėme failo pabaigą.
Ir tada pagal tą punktą, mes jau atspausdinta
iš visą turinį į failą.
Taigi dar kartą, mes tik matėme fopen, fclose ir fgetc
ir jau galime dubliuoti Linux terminalas komanda.
>> Kaip minėjau pradžioje, mes turėjome fgetc ir fputc,
ir fputc buvo kompanionas funkcija fgetc.
Ir taip, kaip jūs gali įsivaizduoti, tai yra rašymo ekvivalentas.
Jis leidžia mums parašyti vieną simbolį į failą.
>> Vėlgi, įspėjimas yra, tik kaip tai buvo su fgetc, failas
kad mes raštu must've buvo atidarytas raštu arba pridedant.
Jei mes stengiamės ir naudoti fputc ant failo kad mes atidaryti skaitymui,
mes ketiname kenčia padaryta klaida tiek.
Tačiau skambutis yra gana paprasta.
fputc kapitalu ptr2 visi kad ketina padaryti, tai jis
ketina rašyti laišką į A į failą 2 taškais
tekstas, kuris buvo pavadinimas failą, mes atidarėme ir priskirti
rodyklė į ptr2.
Taigi mes ketiname parašyti kapitalo A iki failą 2 dot tekstą.
Ir mes parašyti šauktuką rodo, kad bylos 3 taškais
tekstas, kuris buvo pažymėta, kad iki ptr3.
Taigi dar kartą, gana paprasta čia.
>> Bet dabar mes galime padaryti kitą dalyką.
Mes turime šį pavyzdį mes buvome tik vyksta per
apie galimybę atkartoti katė "Linux" komandą, vienas, kad spausdina
ekrane.
Na, dabar, kad mes turime galimybę skaityti simbolius iš failų
ir rašyti simbolių failus, kodėl ne mes tiesiog pakeisti, kad
skambinti printf, ragindamas fputc.
>> Ir dabar mes dubliuoti cp, labai paprastas Linux komandinės
kad mes kalbėjome apie kelias ilgas prieš Linux komandas vaizdo.
Mes Veiksmingai dubliuoti, kad čia.
Mes skaityti simbolį ir tada mes Rašydamas, kad charakterį į kitą failą.
Skaitymas iš vieno failo, rašymo į kitą, per ir per
ir vėl, kol mes hit EOF.
Mes turime prie pabaigos file mes bandome kopijuoti iš.
Ir kad mes parašėme visi simbolių turime failo
kad mes raštu.
Taigi tai yra CP, Linux kopija komanda.
>> Pačioje pradžioje Šiame vaizdo, aš turėjau įspėjimu
kad mes pakalbėti Šiek tiek apie rodykles.
Čia yra specialiai kur mes ketiname kalbėti apie rodykles
be to, byla patarimų.
Taigi ši funkcija atrodo rūšies baisu.
Jis gavo kelis parametrus.
Yra daug vyksta čia.
Yra įvairių daug spalvos ir tekstų.
Bet iš tikrųjų, tai tik bendrinis versija fgetc
kad leidžia mums gauti bet informacijos kiekis.
Jis gali būti šiek tiek neefektyvus, jei mes gauti simbolius vienu metu,
Iteracja per failas vienas simbolis vienu metu.
Ar nebūtų gražiau gauti 100 vienu metu arba 500 vienu metu?
>> Na, fread ir jos kompanionas funkcija fwrite, kuri mes kalbame apie
per sekundę, leiskite mums padaryti tik tai.
Mes galime skaityti savavališkai sumą informaciją iš failo
ir mes saugome jį kažkur laikinai.
Vietoj galėtų tik tilpti į vieną kintamąjį,
mes gali tekti laikyti jį masyvą.
Ir taip, mes pereiname iš keturių argumentai fread-- rodyklę
į vietą, kurioje mes ketina saugoti informaciją,
kaip didelis kiekvieną informacijos vienetą bus, kiek vienetų informacijos
mes norime įsigyti, o iš kuris failas norime juos gauti.
Turbūt geriausiai iliustruoja su pavyzdyje.
Taigi tarkime, kad mes pareiškiame kaip 10 skaičių masyvas.
Mes ką tik paskelbė dėl kamino savavališkai int ARR 10.
Taigi tai gana paprasta.
Dabar, ką mes darome, nors yra frecall yra mes skaityti dydį int
kartų 10 baitų informacijos.
Dydis int būties four-- tai iš in c sveikojo skaičiaus dydis.
>> Taigi, ką mes darome, yra mes skaityti 40 baitų verta informacijos
iš failo, į kurį nurodo PTR.
Ir mes laikyti tie 40 baitų kažkur
kur mes atidėtos 40 baitų verta atmintyje.
Laimei, mes jau padaryta, kad deklaruojant aranžuotė, kad masyvas teisę ten.
Tai galima laikyti 10 keturių baitų vienetų.
Taigi, iš viso, ji gali turėti 40 baitų verta informacija.
Ir mes dabar skaito 40 baitų informaciją iš failo,
ir mes ją saugoti ARR.
>> Prisiminkite, iš ant rodyklės vaizdo, kad iš masyvo, pavyzdžiui, ARR vardas,
yra tikrai tik rodyklė jo pirmojo elemento.
Taigi, kai mes pereiti į ARR ten, mes yra, iš tiesų, einančios į rodyklė.
>> Panašiai mes galime padaryti this-- mes nebūtinai
reikia išsaugoti mūsų buferis ant kamino.
Mes taip pat gali dinamiškai paskirstyti buferis, kaip šis, naudojant malloc.
Atminkite, kad, kai mes dinamiškai paskirstyti atmintį,
mes taupyti ant krūva, o ne krūvą.
Bet tai dar buferio.
>> Ji vis dar, šiuo atveju, yra turintis 640 baitų informacijos
nes dvigubas užima aštuoni baitai.
Ir mes prašome už 80 iš jų.
Mes norime turėti erdvę surengti 80 dviviečiai kambariai.
Taigi 80 kartų 8 640 baitų informacijos.
Ir tai kvietimas fread yra rinkti 640 baitų informacijos
nuo failas, į kurį nurodo PTR ir saugoti ją dabar arr2.
>> Dabar mes taip pat galime traktuoti fread kaip skambučio į fgetc.
Šiuo atveju mes tiesiog bando gauti vieną simbolį iš failo.
Ir mums nereikia masyvas surengti charakterį.
Mes galime tik laikyti jį personažas kintamasis.
>> Laimikis, nors, yra tai, kad kai mes tiesiog kintamąjį,
mes turime pereiti į adresas, kad kintamasis
nes Prisiminkite, kad Pirmasis argumentas fread
yra rodyklė į vietą, ir atminties kur norime saugoti informaciją.
Vėl, pranešė apie pavadinimas masyvas yra žymeklis.
Taigi mums nereikia daryti Ampersand masyvo.
Bet c, simbolis c čia yra ne masyvo.
Tai tiesiog kintamasis.
Ir todėl mes turime praeiti Ženklas c nurodyti
kad tai adresas, kur mes norime saugoti šį vieną baitą informacijos
tai vienas personažas, kad mes rinkti iš PTR.
Fwrite-- aš eisiu per Tai šiek tiek daugiau
quickly-- yra gana daug Tikslus atitikmuo fread
išskyrus tai rašyti o ne skaityti, tiesiog
patinka other-- mes jau atidarytas ir uždaryti, gauti simbolį,
parašyti charakterį.
Dabar atėjo gauti savavališkas informacijos kiekis,
teisę savavališkai informacijos kiekis.
Taigi kaip ir anksčiau, mes galime turi 10 sveikieji masyvo
kur jau turime saugoma informacija, galbūt.
>> Tai tikriausiai buvo keletas kodo eilučių kad reikia eiti tarp šių dviejų
kur aš užpildyti ARR su kažką prasmingo.
Aš užpildyti jį su 10 skirtingų skaičių.
Ir vietoj to, ką aš darote, yra raštu iš ARR
ir rinkti iš ARR informaciją.
Ir aš atsižvelgiant, kad informacija ir išleisti jį į failą.
>> Taigi vietoj to yra iš į buferį failą,
mes dabar vyksta nuo buferis į failą.
Taigi tai tik atvirkščiai.
Taigi dar kartą, kaip ir anksčiau, mes galime taip pat turi krūvą riekė atminties
kad mes dinamiškai skiriama ir skaityti nuo
ir rašyti, kad į failą.
>> Ir taip pat turėti vieną kintamąjį galima laikyti vieną baitą
informacijos, pavyzdžiui, pobūdžio.
Bet vėl, mes turime pereiti į tos kintamojo adresas
kai norime skaityti iš jos.
Taigi, mes galime parašyti informacija randame tuo adresu
į failo žymeklis, PTR.
>> Yra daug kitų puikus failų įvesties / išvesties funkcijos
kad daryti įvairius dalykus, be tie mes kalbėjome apie šiandien.
A tie pora jūs galite rasti naudinga
yra fgets ir fputs, kuris yra ekvivalentinis
iš fgetc ir fputc bet skaityti viena eilutė iš failo.
Vietoj to, vienas simbolis, ji bus perskaityti visą eilutę.
fprintf, kuris iš esmės leidžia jums naudoti printf rašyti į failą.
Taigi kaip jūs galite padaryti kintamasis Keitimas naudojant
rezervuotų vietų proc I ir procentų d, ir taip toliau, su printf
galite taip pat imtis printf styginių ir spausdinti kažką
kaip kad į failą.
>> fseek-- jei turite DVD grotuvas yra analogija Aš paprastai naudoju here--
yra tarsi naudojant jūsų atgal ir pirmyn
mygtukus, kad judėti filmą.
Be to, galite judėti failą.
Vienas iš dalykų, viduje kad failų struktūra
kad c sukuria jums tai rodiklis, kur jūs esate failo.
Ar ne labai pradžioje, baitas nulio?
Ar ne baitas 100, baitas 1000 ir tt?
Galite naudoti fseek savavališkai perkelti kad rodiklis pirmyn arba atgal.
>> Ir vėl ftell, panašus į DVD grotuvas,
yra tarsi šiek tiek laikrodžio, pasakoja Jūs, kiek minučių ir sekundžių Jūs
yra į tam tikrą filmą.
Panašiai ftell jus, kaip pasakoja daug baitų esate į failą.
feof yra kita versija aptikti, ar jūs
pasiekė failo pabaigoje.
Ir ferror yra funkcija kad jūs galite naudoti
siekiant nustatyti, ar kažkas turi negerai dirba su byla.
Vėl, tai tik braižymo paviršiaus.
Yra dar daug daugiau failų įvesties / išvesties funkcijos standarte io.h.
Bet tai tikriausiai jums pradėjo dirbti su failų rodykles.
Aš Doug Lloyd.
Tai CS50.