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.