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.