>> SPEAKER: Siiani on tõenäoline et enamik teie programmid
on natuke üürike.
Sa jooksed programmi nagu Mario või ahne.
Ta teeb midagi, siis äkki küsib kasutaja mõned andmed,
prindi mõned väljund ekraanile, aga siis, kui oma programmi üle,
seal on tõesti mingit tõendit seal see oli kunagi joosta esimese koha.
Ma mõtlen, kindel, siis oleks jäänud see oli avatud terminali aknas
aga kui sa selget ekraani, seal on tõesti mingeid tõendeid, et see olemas.
Meil ei ole mõeldud kõikvõimalike püsiv, mille puhul teave
mis eksisteerib pärast meie Programm on peatatud,
või me ei ole kuni selle punktini.
Õnneks küll, c ei annavad meile võime
seda teha, rakendades midagi, mida nimetatakse
Faili struktuur, mis põhimõtteliselt tähistab faili kahekordistuks
Klõpsake oma arvutisse, kui olete kasutatakse graafilise kasutajaliidese keskkond.
Üldiselt, kui ta töötab C-ga, me oleme tegelikult
hakatakse koostööd viiteid files-- faili stars--
va natuke kui me räägime paar
funktsioone, mis töötada failiosutajaid.
Sa ei pea olema tõesti kaevatud liiga sügavale mõista viiteid
ise.
Seal on vähe teeny natuke kus me räägime neist,
kuid üldiselt failiosutajaid ja suunanäitajaks, kuid omavahel seotud,
ei ole täpselt sama asi.
>> Mida ma nüüd mõtlen, kui Ma ütlen püsiv andmed?
Mis on püsiv andmed?
Miks me hoolime sellest?
Ütle, et näiteks näed programm
või olete ümber kirjutada programm, mis on mängus,
ja soovite jälgida Kõike kasutaja liigub
nii et võibolla kui midagi läheb valesti, saate vaadata faili pärast mängu.
See, mida me mõtleme, kui me rääkida püsiv andmeid.
>> Selle käigus töötab teie programmi, faili on loodud.
Ja kui teie programm on seiskunud,
et fail on ikka veel olemas oma süsteem.
Ja me saame vaadata ja uurida.
Ja nii, et programm oleks seatud loonud mõned püsivad andmed,
andmed ka pärast programmi on töö lõpetanud.
>> Nüüd on kõik need funktsioonid, mis töötavad koos failide loomiseks ja manipuleerimiseks
neil erinevatel viisidel elan standard io.h,
mis on päisefailist Sa oled tõenäoliselt juba nael
sealhulgas ülaosas päris palju kõik oma programmid
kuna see sisaldab üks kõige kasulikke funktsioone meile,
printf, mis lubab ka elab standard io.h.
Nii et sa ei pea nael hulka täiendavaid faile ilmselt
et töötada failiosutajaid.
>> Nüüd iga faili viitaja funktsiooniga, või iga faili I / O, sisend väljund
funktsioon, nõustub üks teguritest või sisendite
faili pointer-- välja ühe, fopen, mille
on see, mida te kasutate, et saada faili pointer esimese koha.
Aga kui olete avanud faili ja sa saad failiosutajaid,
saate edastada neid argumente erinevate funktsioonide
me ei kavatse rääkida Täna, samuti paljud teised
nii et saate töötada faile.
>> Nii on kuus päris ühiste põhi- ones
et me ei kavatse rääkida täna.
fopen ja tema kaaslane funktsiooni kirjutamisel, fgetc
ja tema kaaslane funktsiooni fputc, ja fread ja tema kaaslane funktsiooni,
fwrite.
Nii lähme otse ta.
>> fopen-- mida see teeb?
Noh, see avab faili ja see annab teile faili viitaja seda,
nii et saad siis kasutada, et file pointer argumendina
ükskõik millise muu faili I / O funktsioone.
Kõige tähtsam meeles pidada koos fopen
on, et kui olete avanud esitada või teha kõne nagu üks siin,
sa pead veenduge, et kursorit, et sul tagasi
ei ole võrdne null.
Kui te ei ole vaatasin videot viiteid, et see ei pruugi mõtet.
Aga kui sa püüad ja apparent nullviida meenutada,
oma programmi ilmselt kannatada laevastikuosi [kuuldamatu].
Me tahame veenduda, et me sain õigustatud pointer tagasi.
Valdav enamus ajast me saanud õigustatud pointer tagasi
ja see ei ole probleem.
>> Niisiis, kuidas me helistada fopen?
Tundub üsna sarnane sellele.
Faili star ptr-- PTR on üldine failinimi pointer-- fopen
ja me sündis kaks asja, failinime ja operatsiooni tahame teha.
Nii et me oleks võinud kõne, mis näeb välja nagu see-- faili star PTR 1 võrdub fopen
file1.txt.
Ja operatsiooni olen valinud on r.
>> Mis sa arvad, r on siin?
Millised on asju, mida me võiksid teha faile?
Nii r on toiming, et me valida, kui me tahame, et lugeda faili.
Nii et me oleks põhimõtteliselt kui me helistada niimoodi
saada end faili viitaja nii et võiksime lugeda andmeid
alates file1.txt.
>> Samamoodi võiksime avada faili 2.txt kirjutamiseks ja nii saame edasi ptr2,
faili viitaja lõin siin argumendina ühtegi funktsiooni, mis
kirjutab andmed faili.
Ja sarnane kirjalikult, seal on Samuti võimalus lisada, a.
Erinevus kirjalikult ja kleebi
on see, et kui sa kirjutad faili, kui sa helistada fopen kirjutamiseks
ja mis fail on juba olemas, see on läheb üle kirjutada kogu toimikule.
See saab alustada alguses,
kustutab kõik andmed see on juba olemas.
>> Arvestades, kui avate seda lisades, see läheb lõpuks faili
kui seal on juba teksti või teavet selle,
ja see on siis alustada kirjalikult sealt.
Nii et sa ei kaota tahes teavet, mida olete teinud.
Kas soovite kirjutada või lisada omamoodi sõltub olukorrast.
Aga sa ilmselt tead, mida õigus tehing on, kui saabub aeg.
Nii et fopen.
>> Aga kirjutamisel?
Noh, päris lihtsalt, kirjutamisel lihtsalt võtab faili viitaja.
Ja kui te võite arvata, sulgub et fail.
Ja kui me oleme suletud faili, me ei saa täita enam faili I / O funktsioone,
lugemise või kirjutamise, toimiku kohta.
Meil on uuesti avada esitada muul ajal, et
jätkata koostööd see kasutades I / O funktsioone.
Nii kirjutamisel tähendab, et me teinud töötavad selle faili.
Ja kõik peame läbima on nimi faili viitaja.
Nii et paar libiseb tagasi, me fopened faili 1 dot teksti lugemine
ja me määrata, et file pointer ptr1.
Nüüd oleme otsustanud me oleme teinud lugemine, et fail.
Meil ei ole vaja teha enam sellega.
Me ei saa lihtsalt kirjutamisel ptr1.
Ja samamoodi võiksime kirjutamisel teisi ones.
Hästi.
Nii et on avamise ja sulgemise.
Need on kaks peamist käivitada.
>> Nüüd tahame tegelikult teha mõned huvitavad asjad,
ja esimene funktsioon, mida me tulen näha, et teen seda on fgetc--
Fail Hangi iseloomu.
Seda fgetc üldiselt oleks tõlkida.
Selle eesmärk elus on loe järgmine sümbol,
või kui see on teie väga Esimene kõne fgetc
Konkreetse faili esimene märk.
Aga siis pärast seda, saad järgmise,
juba järgmisel iseloomu, et fail, ja salvestab selle märk muutuja.
Kuna me oleme siin teinud, char ch võrdub fgetc,
pass nime faili viitaja.
Jällegi, see on väga siin oluline meeles pidada
et selleks, et olla see operatsioon õnnestub,
faili viitaja ise vist avati lugemiseks.
Me ei saa lugeda tegelasele faili pointer, et avasime kirjutamiseks.
Nii et üks piiranguid fopen, eks?
Meil on piirata ise ainult täitmisel
üks operatsioon ühe faili viitaja.
Kui me tahame, et lugeda ja kirjutada samast failist,
meil oleks avatud kaks eraldiseisvat failiosutajaid sama file--
üks lugemine, üks kirjutamiseks.
>> Nii jälle, ainus põhjus Ma toon, et nüüd on
sest kui me ei kavatse helistada to fgetc, et faili viitaja vist
avati lugemiseks.
Ja siis päris lihtsalt, kõik me peame tegema
on läbida nime faili viitaja.
Nii char ch võrdub fgetc ptr1.
>> See läheb meid Järgmise character--
või jällegi, kui see on esimene aega oleme teinud seda üleskutset,
Esimeses character-- iganes fail, millele viitab ptr1.
Tuletame meelde, et see oli faili 1 dot teksti.
Seda saad saada esimene märk, et ja me seda säilitada muutuja ch.
Päris lihtne.
Nii et me oleme vaadelnud vaid kolm funktsioonid ja juba me
saab midagi päris kena.
>> Nii et kui me võtame selle võime saada iseloomu
ja me loop see-- nii me jätkuvalt saada tähemärki
failist üle ja üle ja over-- nüüd
saab lugeda iga iseloomu faili.
Ja kui me printida iga tegelane kohe pärast loeme seda,
oleme nüüd lugeda failist ja trükitud sisu ekraanile.
Me oleme tegelikult konkateneeriti et faili ekraanil.
Ja see on, mida Linux käsk kass teeb.
>> Kui kirjutad kass faili nimi, ta trükib välja kogu sisu
faili oma terminali aknas.
Ja nii see väike loop siin ainult kolm rida koodi,
kuid tegelikult dubleerib Linuxi käsk kass.
Nii et see süntaks võiks vaadata veidi imelik,
kuid siin on, mis siin toimub.
Kuigi ch võrdub fgetc, PTR ei ole võrdne EOF-- see on kogu suutäie
kuid olgem jaotada see lihtsalt nii et see on selge süntaks.
Olen konsolideeritud see huvides ruumi,
kuigi see on natuke süntaktiliselt keeruline.
>> Nii et see osa roheline õigus nüüd, mida ta teeb?
Noh, see on lihtsalt meie fgetc kõne, eks?
Me oleme näinud, et enne.
See soetatakse tegelasele faili.
Siis me võrdleme et märgi vastu EOF.
EOF on eriline väärtus, mis on määratletud standard io.h, mis
on faili lõppu iseloomu.
Ühesõnaga, mida juhtub See loop loeb iseloom,
võrrelda seda EOF on faili lõppu iseloomu.
Kui nad ei sobi, et me ei ole jõudnud faili lõppu,
me printida, et iseloomu välja.
Siis lähme tagasi alguses loop uuesti.
Võtame tegelane, vaadake vastu EOF, välja trükkida ja nii edasi
ja nii edasi ja nii edasi, silmukoiminen läbi niimoodi
kuni oleme jõudnud faili lõppu.
Ja siis selles punktis, me oleme trükitud
välja kogu faili sisu.
Nii jälle, me oleme näinud ainult fopen, kirjutamisel ja fgetc
ja juba me ei dubleeri Linuxi terminali käsk.
>> Nagu ma ütlesin alguses, meil oli fgetc ja fputc,
ja fputc oli kaaslane funktsioon fgetc.
Ja nii, nagu te võite ette kujutada, see on kirjalikult samaväärne.
See võimaldab meil kirjutada üks märk faili.
>> Jällegi hoiatus on lihtsalt nagu see oli fgetc faili
et me kirjutame vist olnud avatud kirjalikult või lisades.
Kui me püüame kasutada fputc failil et oleme avatud lugemise
me ei kavatse kannatada natuke viga.
Aga kõne on üsna lihtne.
fputc Kapitali vorm ptr2 kõik mis tegema hakkab on see
kavatsete kirjutada kiri A- arvesse faili 2 dot
tekst, mis oli nime esitada, et avasime ja määratud
kursor ptr2.
Nii et me kirjutame Kapitali vorm esitada 2 dot teksti.
Ja me kirjutada hüüatus juhtida esitada 3 dot
teksti, mis osutas poolt ptr3.
Nii jälle üsna lihtne siin.
>> Aga nüüd me saame teha teine ​​asi.
Meil on see näiteks olime lihtsalt läheb üle
kas nad suudavad imiteerida kass Linux käsk, mis prindib välja
ekraani.
Noh, nüüd on meil võimalus loe tähemärki faile
ja kirjutada märki faile, miks me lihtsalt ei asenda, et
helistage printf koos kõne fputc.
>> Ja nüüd me oleme dubleeritud cp, väga lihtne Linux käsk
et me rääkisime, kuidas pikk tagasi Linuxi käsud video.
Me oleme tegelikult dubleeritud, et siinsamas.
Me loed iseloomu ja siis me oleme kirjalikult, et tegelane teise faili.
Lugemine üks fail, kirjalikult teise, ikka ja jälle
ja jälle, kuni me tabanud EOF.
Me peame lõpuks esitada me üritame kopeerida.
Ja et me kirjutanud kõik tegelaste peame faili
et me kirjutame.
Nii et see on cp, Linux koopia käsk.
>> Alguses on see video oli mul hoiatus
et meil oleks rääkida natuke vihjeid.
Siin on spetsiaalselt kus me oleme räägime viiteid
Lisaks failiosutajaid.
Nii et see ülesanne tundub selline jube.
See sai mitmeid parameetreid.
Seal on palju siin toimub.
Seal on palju erinevaid värvid ja tekste.
Aga tõesti, see on lihtsalt generic versioon fgetc
mis võimaldab meil saada mingeid informatsiooni hulk.
See võib olla veidi ebaefektiivne, kui me oleme saada tegelased ükshaaval,
iterating läbi faili üks täht korraga.
Kas poleks ilusam saada 100 korraga või 500 korraga?
>> Noh, fread ja tema kaaslane funktsiooni fwrite, mis me räägime
teises, võimaldab meil teha just seda.
Me võime lugeda suvalise summa Teabe failist
ja me salvestada see kuskil ajutiselt.
Selle asemel, et oleks võimalik lihtsalt sobitada see ühe muutuja,
võiks olla vaja seda säilitada massiivi.
Ja nii me edasi nelja argumente fread-- osuti
kohta, kus me oleme läheb, et säilitada teavet,
kui suured infoüksus on mitu ühikut teavet
tahame omandada, ja mis faili tahame jõuda.
Tõenäoliselt kõige ilmekamalt koos näiteks siin.
Ütleme, et me kuulutame massiivi 10 täisarvud.
Me oleme lihtsalt deklareeritud Kestab meelevaldselt int arr 10.
Nii et on üsna lihtne.
Nüüd, mida me teeme, kuigi on frecall on meil loed suurus int
korda 10 baiti andmeid.
Suurus int olend four-- see on suurus täisarv c.
>> Mida me teeme on meil loed 40 baiti väärt info
failist poolt esile tõstetud PTR.
Ja me ladustamiseks neid 40 baiti kusagil
kus me oleme kõrvale 40 baiti väärt mälu.
Õnneks oleme juba teinud, et kuulutatakse arr, et massiivi seal.
See mahub 10 neljabaidisel ühikut.
Nii kokku, siis mahub 40 baiti väärt informatsiooni.
Ja nüüd lugedes 40 baiti teabe faili,
ja me talletades seda arr.
>> Tagasikutsumise video viiteid, et nimi massiivi, nagu arr,
on tõesti ainult pointer tema esimene element.
Nii et kui me sündis arr seal, on tegelikult kulgeb osuti.
>> Samamoodi saame teha see-- Me ei pruugi
vaja päästa meie puhver stack.
Võiksime ka dünaamiliselt eraldada puhver niimoodi, kasutades malloc.
Pea meeles, kui me dünaamiliselt eraldada mälu,
me salvestamist kohta hunnik, mitte virna.
Aga see on ikka puhvri.
>> See ikka, sel juhul on hoiab 640 baiti andmeid
sest topelt kulub kaheksa baiti.
Ja me paludes 80 neist.
Me tahame ruumi hoida 80 kahekohalist tuba.
Nii 80 korda 8 640 baiti andmeid.
Ja et kõne fread on koguda 640 baiti andmeid
failist poolt esile tõstetud PTR ja säilitamist nüüd arr2.
>> Nüüd saame ka ravida fread nagu kõne fgetc.
Sel juhul me lihtsalt üritan saada üks märk failist.
Ja me ei pea massiivi korraldada iseloomu.
Me saame vaid seda säilitada märk muutuja.
>> Saak on aga, et kui me lihtsalt olla erinev,
peame pass aadress, et muutuja
sest meenutavad, et Esimene argument, et fread
on viit asukoha ja mälu kus me tahame säilitada teavet.
Jällegi nimele massiiv on osuti.
Nii et me ei pea tegema ampersand massiivi.
Aga c, iseloomu c Siin ei ole valikut.
See on lihtsalt erinevad.
Ja nii on meil vaja läbida ampersand c näidata
et see on aadress, kuhu me tahame salvestada selle ühe baidi info
see üks märk, et me koguda alates PTR.
Fwrite-- ma lähen läbi Selle veidi rohkem
quickly-- on päris palju täpse vaste fread
välja arvatud see kirjutamiseks lugemise asemel, lihtsalt
nagu other-- oleme olnud avatud ja tihe, saad iseloomu,
kirjutada iseloomu.
Nüüd on saada suvalise informatsiooni hulk,
õigus suvaline hulk teavet.
Nii nagu enne, saame on massiivi 10 täisarvud
kus meil on juba salvestatud teave, võib-olla.
>> See oli ilmselt mõned read koodi et peaks minema nende kahe
kus ma täita Arr koos midagi olulist.
Täidan 10 erineva täisarvu.
Ja selle asemel, mida ma olen tehes on kirjutamise arr
ja andmete kogumisel arr.
Ja ma võtan seda teavet ja selle kasutuselevõtul faili.
>> Nii et selle asemel, et oleks alates faili puhver,
me nüüd läheb puhver faili.
Nii et see on just vastupidi.
Nii jälle, nagu enne, saame Samuti on hunnik patakas mälu
et me oleme dünaamiliselt eraldatud ja lugeda, et
ja kirjutada, et faili.
>> Ja meil on ka ühe muutuja mahub üks bait
Teabe nagu iseloomu.
Aga jälle, peame läbima aadressi selle muutuja
Kui me tahame, et lugeda seda.
Nii saame kirjutada teave leiame sellele aadressile
faili pointer, PTR.
>> Seal on palju muud suur fail I / O funktsioonid
et teha erinevaid asju peale need, mida me rääkisime täna.
Paar need mis võivad teile kasulik
on fgets ja fputs, mis on samaväärne
of fgetc ja fputc kuid lugemine ühe string failist.
Selle asemel, et ühe märgi, siis loe kogu string.
fprintf, mis põhimõtteliselt võimaldab Teil kasutada printf kirjutada faili.
Nii nagu sa saad teha muutuja vahetusest kasutades
kohatäited protsenti i ja protsenti d, ja nii edasi, kusjuures printf
saab sarnaselt võtta printf string ja print midagi
niimoodi faili.
>> fseek-- kui sul on DVD-mängija on analoogiline ma tavaliselt kasutada siin--
on omamoodi nagu kasutades oma tagasikerimine ja kiiresti edasi
nupud liikuda filmi.
Samamoodi saab liikuda faili.
Üks asi sees et faili struktuur
et c loob teile on näitaja kus sa oled faili.
Kas sa oled päris algusega kell bait null?
Oled baidi 100, bait 1000, ja nii edasi?
Võite kasutada fseek suvaliselt liigutada et indikaator edasi või tagasi.
>> Ja ftell taas sarnane DVD-mängija,
on nagu väike kell, mis ütleb kui palju minuteid ja sekundeid sulle
on arvesse konkreetse filmi.
Samuti ftell ütleb teile, kuidas palju baite olete failis.
feof on erinev versioon tuvastamiseks, kas olete
jõudnud faili lõppu.
Ja ferror on funktsioon mida saab kasutada
tuvastada, kas midagi on valesti läinud töö failiga.
Jällegi, see on lihtsalt kriimustamata.
Seal on veel palju rohkem faili I / O funktsioonid standard io.h.
Aga see on ilmselt sulle alustas tööd failiosutajaid.
Ma olen Doug Lloyd.
See on CS50.