Parolanto: Ĝis nun, ĝi estas verŝajna ke plimultaj viaj programoj estis iom efemera. Vi kuras programon kiel Mario aŭ avidaj. Ĝi faras iom, ĝi eble instigas la uzanto por iu informo, presi iuj eligo al la ekrano, sed tiam, kiam via programo estas finita, Tie estas vere neniu indico ekzistas ĝi estis iam kuri en la unua loko. Mi signifas, Certe, vi povus esti lasita ĝi malfermos en la fina fenestro, sed se vi demetas via ekrano, ekzistas vere neniu indico ke ĝi ekzistis. Ni ne havas rimedon stokante persista informo, informoj kiu ekzistas post nia programo haltis kurante, aŭ ni ne havas ĝis tiu punkto. Feliĉe tamen, c faras provizi nin per la kapablo fari tion per efektivigado iu nomita dosiero, strukturo kiu esence reprezentas dosiero kiu vi duobligus klaku sur via komputilo, se vi estas uzita grafika uzanto medio. Ĝenerale kiam laborante kun c, Ni efektive tuj estos laborante kun punteros al files-- dosiero stars-- krom iomete kiam ni parolas pri paro de la funkcioj kiuj labori kun dosiero punteros. Vi ne bezonas esti vere fosadis tro profunde en kompreno punteros sin. Ekzistas iom teeny iom kie ni parolos pri ili, sed ĝenerale file punteros kaj punteros, dum interrilatigitaj, ne ekzakte la sama afero. Nun kion mi volas diri kiam Mi diras persistaj datumoj? Kio estas persistaj datumoj? Kial ni zorgas pri ĝi? Diru, ekzemple, ke vi uzas programon aŭ vi reskribita kiel Programo kiu estas ludo, kaj vi volas konservi trako de ĉiuj la uzanto movas tiel ke eble se iu eliras malbone, vi povas revizii la dosieron post la ludo. Tion ni volas diri kiam ni paroli pri persistaj datumoj. En la paso de via kurado programo, dosiero estas kreita. Kiam via programo haltis kurante, ke dosiero ankoraŭ ekzistas en via sistemo. Kaj ni povas rigardi ĝin kaj ekzameni ĝin. Kaj por ke programo estus metita al kreis iuj konstantaj datumoj, datumoj ekzisti post la programo finis kurante. Nun ĉiuj tiuj funkcioj kiuj laboras kun kreanta dosierojn kaj manipulanta ilin diversmaniere vivi en norma io.h, kiu estas kaplinio dosiero kiu vi verŝajne estis funto inkluzive ĉe la supro de belaj multa ĉiuj viaj programoj ĉar ĝi enhavas unu el la plej utilaj funkcioj por ni, printf, kiu ankaŭ ebligas vivas en norma io.h. Do vi ne bezonas marteladi inkluzivi ajna aldona dosierojn probable por labori kun dosiero punteros. Nun ĉiu unuopa dosiero puntero funkcio, aŭ ĉiu unuopa dosiero / S, enigo eligo funkcio, akceptas kiel unu de liaj parametroj aŭ enigoj dosiero pointer-- krom cxar unu, fopen, kiu Estas kion vi uzas por akiri la dosieron montrilon en la unua loko. Sed post vi malfermis la Arkivo kaj vi ricevas dosieron punteros, Vi povas tiam pasi ilin kiel argumentoj al la diversaj funkcioj ni tuj parolos pri hodiaŭ, tiel kiel multaj aliaj por ke vi povas labori kun dosierojn. Do estas ses bela komuna bazaj ke ni iras paroli hodiaŭ. fopen kaj lia kompano funkcio fclose, fgetc kaj lia kunulo funkcio fputc, kaj Fread kaj lia kunulo funkcio, fwrite. Do ni ricevas internen. fopen-- kion ĝi faras? Nu, ĝi malfermas dosieron kaj ĝi donas vin dosieron puntero al ĝi, por ke vi povas tiam uzi tiun file puntero kiel argumento al ajna de la aliaj dosiero / S funkcioj. La plej grava afero memori kun fopen estas ke post kiam vi malfermis la file aŭ faris nomita kiel la ĉi tie, Vi devas kontroli por certiĝi ke la puntero ke vi revenis estas ne egala al nula. Se vi ne spektis la videon sur punteros, eble tio ne havas sencon. Sed se vi provas kaj dereference nula puntero revokon, Via programo estos probable suferas segmentación [inaudible]. Ni volas certigi ke ni ricevis legitiman montrilo reen. La vasta plimulto de la tempo ni volas akiris leĝan montrilo reen kaj ĝi ne estos problemo. Do kiel ni faras alvokon al fopen? Ĝi aspektas preskaux kiel tiu. Dosiero stelo ptr-- PTR esti genérico citi por dosiero pointer-- fopen kaj ni pasas en du aferojn, dosiernomon kaj operacion ni volas entrepreni. Do ni havu alvoko kiu similas this-- dosieron stelo ptr 1 egalas fopen file1.txt. Kaj la operacio mi elektis estas r. Do kion vi pensas r estas ĉi tie? Kio estas la specoj de aferoj ni eble povus fari al dosieroj? Do r estas la operacio kiu ni elekti kiam ni volas legi arkivon. Do ni volus esence kiam ni faras alvokon ŝatas tion esti akiranta nin dosiero montrilon tia, ke ni povis tiam legi informojn el file1.txt. Simile, ni povus malfermi dosieron 2.txt por skribo kaj tiel ni povos tradormi ptr2, la dosiera montrilo mi kreis ĉi tie, kiel argumento por ajna funkcio kiu skribas informon en dosieron. Kaj simila al skribo, ekzistas ankaŭ la eblon append, al. La diferenco inter skribado kaj appending esti ke kiam vi skribas al dosiero, se vi fari alvokon al fopen por skribado kaj ke dosiero jam ekzistas, ĝi estas tuj anstataŭigi la tutan dosieron. Ĝi tuj komencas tuj en la komenco, viŝante ĉiu informo tio jam ekzistas. Dum se vi malfermas ŝin por appending, ĝi iros al la fino de la dosiero se estas jam malplena ĝi aŭ informo en ĝi, kaj ĝi tiam komencas skribado de tie. Do vi ne perdas neniun de la informoj vi faris antaŭe. Ĉu vi volas skribi aux append ia dependas de la situacio. Sed vi probable scias kion la dekstra operacio estas kiam la tempo venas. Do jen fopen. Kio pri fclose? Nu, bela simple, fclose nur akceptas la dosiera montrilo. Kaj kiel vi povus atendi, Fermo de tiu dosiero. Kaj unufoje ni fermis dosiero, ni ne povas elfari plu dosiero / S funkcioj, legi aŭ skribi en tiu dosiero. Ni devas re-malfermi la file alifoje por daŭrigi laborante kun ĝin uzante la I / O funkcioj. Do fclose rimedoj ni faris laborante kun ĉi tiu dosiero. Kaj ĉiuj ni devas pasi en estas la nomo de dosiero puntero. Do sur paro glitas antaŭe, Ni fopened dosiero 1 skalara teksto por legado kaj ni atribuita ke dosieran montrilon al ptr1. Nun ni decidis ke ni estas faris legadon de tiu dosiero. Ni ne bezonas fari plu per ĝi. Ni povas nur fclose ptr1. Kaj simile, eble ni fclose la alia ones. Bone. Do jen malfermante kaj fermante. Tiuj estas la du bazaj komencante operaciojn. Nun ni volas reale fari iuj interesaj aĵoj, kaj la unua funkcio, ke ni vidi kiu faros ke estas fgetc-- file akiri karaktero. Tion fgetc ĝenerale tradukus al. Lia objektivo en la vivo estas legi la venonta signo, aŭ se tio estas via tre unua alvoko al fgetc por aparta dosiero, la unuan karakteron. Sed tuj poste, vi havos la venonta unu, la tre proksima karaktero de tiu dosiero, kaj provizas ĝin en karaktero variablo. Kiel ni faris tie, char ch egalas fgetc, En la nomo de dosiero puntero. Denove, ĝi estas tre grava tie memori ke por havi tiu operacio sukcesos, la dosiera montrilo mem must've estis malfermita por legado. Ni ne povas legi karakteron de dosiero montrilo ni malfermis por skribado. Do jen unu el la limigoj de fopen, dekstra? Ni devas limigi nin al nur elfaranta unu operacio kun unu dosiero puntero. Se ni volis legi kaj skribi de la sama dosiero, ni havus malfermitaj du apartaj dosiero punteros al la sama file-- unu por legado: unu por skribado. Do denove, la sola kialo Mi alportos ke ĝis nun estas ĉar se ni tuj faros alvokon al fgetc, ke dosiero puntero must've estis malfermita por legado. Kaj tiam bela simple, ĉiuj ni devas fari estas pasi en la nomo de la dosiero puntero. Do char ch egalas fgetc ptr1. Tio tuj akiri nin la sekva character-- aŭ denove, se tiu ĉi estas la unua tempo ni faris ĉi tiun alvokon, la unua character-- sendistinge dosiero almontras ptr1. Memoru ke tiu estis dosier 1 skalara tekston. Ĝi ricevos la unuan karakteron de tiu kaj ni konservas ĝin en la variablo ch. Bela simpla. Do ni nur rigardis tri funkcioj kaj jam ni povas fari ion senmanka. Do se ni prenas ĉi kapablo de duumaj karaktero kaj ni buklo it-- tiel ni daŭrigi akiri karakteroj el dosiero super kaj super kaj over-- nun ni povas legi ĉiun karakteron de dosiero. Kaj se ni presi ĉiu karaktero Tuj post ni legis ĝin, ni nun legi de dosiero kaj presita ĝian enhavon al la ekrano. Ni efike kroĉitaj ke dosiero sur la ekrano. Kaj tio estas kion la Linuksa komando kato faras. Se vi tajpas kato en la dosiernomo, ĝi presos la tutan enhavon de la dosiero en via fina fenestro. Kaj tiel ĉi tiu malgranda buklo tie, nur tri linioj de kodo, sed efike duobligas la Linuksa komando kato. Do tiu sintakso eble aspektas iom stranga, sed jen kio okazas tie. Dum ch egalas fgetc, ptr estas ne egala al EOF-- estas tuta buŝplenon, sed ni rompas ĝin malsupren ĵus do ĝi estas klara en la sintakso. Mi jam solidigis pro spacaj, kvankam ĝi estas iom sintakse malfacila. Do tiu parto verde dekstra nun, kion ĝi faras? Nu, tio estas nur nia fgetc alvokon, ĉu ne? Ni vidis ke antaŭe. Ĝi estas sukcesante karaktero de la dosiero. Poste ni komparos kiuj karakteron kontraŭ EOF. EOF estas speciala valoro kiu estas difinita en norma io.h, kiu estas la fino de dosiero karaktero. Do esence kio okazos Estas ĉi buklo legos karakteron, kompari ĝin al EOF, La fino de dosiero karaktero. Se ili ne egalas, do ni havas ne atingis la finon de la dosiero, ni devos presi tiu karaktero eksteren. Tiam ni reiros al la komencante de la buklo denove. Ni akiros karakteron, kontroli kontraŭ EOF, presas ĝin kaj tiel plu kaj tiel plu kaj tiel plu, looping tra tiamaniere ĝis ni atingis la finon de la dosiero. Kaj tiam de tiu punkto, ni estos presita el la tuta enhavo de la dosiero. Do denove, ni nur vidis fopen, fclose kaj fgetc kaj jam ni povas duobligi Linuksa terminalo komando. Kiel mi diris komence, ni havis fgetc kaj fputc, kaj fputc estis la kompano funkcio de fgetc. Kaj do, kiel vi povus imagi, ĝi estas la skribo ekvivalento. Ĝi permesas nin verki sola karaktero al dosiero. Denove, la averto esti, nur kiel estis kun fgetc, la dosiero ke ni skribas al must've estis malfermis por skribi aŭ por appending. Se ni provas kaj uzas fputc sur dosiero ke ni malfermis por legi, ni tuj suferos iom de eraro. Sed la alvoko estas sufiĉe simpla. fputc ĉefurbo A ptr2, ĉiuj tio tuj fari estas ĝi estas tuj skribos la leteron en A enen dosiero 2 skalara teksto, kiu estis la nomo de la file ni malfermis kaj asignita la montrilon al ptr2. Do ni tuj skribos ĉefurbo A al file 2 skalara tekston. Kaj ni skribas ekkrion atentigi arkivi 3 skalara teksto, kiu estis almontras ptr3. Do denove, bela simpla tie. Sed nun ni povas fari alian aferon. Ni havas tiun ekzemplon ni nur tuj super pri povante reprodukti la kato Linuksa komando, kiu presas el al la ekrano. Nu, Nun ke ni havas la kapablon legi karakterojn de dosieroj kaj skribi karakterojn al dosieroj, kial ni ne simple anstataŭigi ke voki al printf kun alvoko al fputc. Kaj nun ni duobligita cp, tre bazajn Linukso komando ke ni parolis pri vojo longa antaŭe en la Linuksa komandas video. Ni jam efike duobligita ke ĝuste ĉi tie. Ni legas karakteron kaj tiam ni skribante ke karaktero al alia dosiero. Legante de unu dosiero, skribo al alia, denove kaj denove kaj denove ĝis ni trafis EOF. Ni havas al la fino de la file ni provas kopii el. Kaj per tio ni skribis cxiujn de la karakteroj ni bezonas la dosieron ke ni skribas al. Do tiu estas cp, la Linukso kopion komando. Ĉe la komenco mem de tiu video, Mi havis la avertrimarko ke ni parolu iomete pri punteros. Jen specife kie ni estas tuj parolos pri punteros aldone al dosiero punteros. Do tiu funkcio similas kiel timiga. Oni alvenis pluraj parametroj. Estas multe okazas tie. Ekzistas multe da malsamaj koloroj kaj tekstoj. Sed vere, estas nur la generic versio de fgetc kiu nin permesas akiri ajnan kvanto de informo. Ĝi povas esti iom ineficiente se ni estas ricevas signojn unuope, ripetanta tra la dosieron unu signo samtempe. Ĉu ne estus pli agrable ricevi 100 unuope aŭ 500 samtempe? Nu, Fread kaj lia kunulo funkcio fwrite, kiuj ni parolos pri en dua, nin permesas fari ĝuste tion. Ni povas legi arbitran kvanton de informoj el dosiero kaj ni konservas ĝin ie temporalmente. Anstataŭ estanta kapabla nur persvadi ŝin en sola variablo, ni eble bezonas por stoki ĝin en tabelo. Kaj tiel, ni pasas en kvar argumentoj por fread-- montrilo al la loko kie ni estas tuj stoki informo, kiom granda ĉiu unuo de informo Estos, kiom da unuoj de informo ni volas akiri, kaj el kiun dosieron oni volas ricevi ilin. Verŝajne plej ilustrita kun ekzemplo tie. Do diru ke ni deklaras tabelo de 10 entjeroj. Ni ĵus deklaris sur la pilo arbitre int arr 10. Do jen bela simpla. Nun kion ni faras tamen estas la frecall estas ni legas grandeco de int fojoj 10 bajtoj de informo. Grandeco de int estaĵo four-- tio la grandeco de entjero en c. Do kion ni faras estas ni legas 40 bitokoj valoro de informo de la dosiero almontras ptr. Kaj ni stokante tiuj 40 bajtoj ie kie ni flankenmetis 40 bitokoj valoro de memoro. Feliĉe, ni jam faris tion per deklarante arr, ke tabelo dekstra tie. Kiu estas kapabla je posedo 10 kvar-bajto unuoj. Do entute, ĝi povas teni 40 bitokoj valoro de informo. Kaj ni estas nun leganta 40 bajtoj de informoj el la dosiero, kaj ni stokante ĝin en arr. Memoras de la video sur punteros kiu la nomo de tabelo, kiel arr, Estas vere nur montrilon al ĝia unua elemento. Do kiam ni pasas en arr tie, ni estas, fakte, pasante en puntero. Simile ni povas fari this-- ni ne nepre bezonas savi nian bufro sur la stako. Ni povus ankaŭ dinamike asigni buffer ŝatas tion, uzante malloc. Memoru, kiam ni dinamike rezervi memoron, ni savanta ĝin sur la amaso, ne la pilo. Sed estas ankoraŭ buffer. Ĝi ankoraŭ, en tiu kazo, estas tenante 640 bajtoj de informo ĉar duoblan dissxutas ok bajtoj. Kaj ni petas por 80 el ili. Ni volas havi spaco teni 80 duobloj. Do 80 fojojn 8 estas 640 bajtoj informo. Kaj ke alvoko al Fread estas kolekti 640 bajtoj de informo de la dosiero almontras ptr kaj stokante ĝin nun en arr2. Nun ni povas ankaŭ trakti Fread nur kiel alvoko al fgetc. En tiu kazo, ni nur provas akiri unu signo de la dosiero. Kaj ni ne bezonas tabelo teni karaktero. Ni povas nur stoki ĝin en gravulo variablo. La kaptaĵo, tamen, estas ke kiam ni nur havas variablo, ni bezonas por pasi en la adreso de tiu variablo ĉar revokon ke la unua argumento al Fread estas puntero al la localización kaj memoro kie ni volas konservi la informon. Denove, la nomon de tabelo estas puntero. Do ni ne bezonas fari ampersand tabelo. Sed c, la signon c tie, ne estas tabelo. Estas nur variablo. Kaj tial ni devas pasi ampersand c por indiki ke jen la adreso kie ni volas stoki ĉi unu bajto de informoj, ĉi tiu karaktero ke ni kolektado de ptr. Fwrite-- mi iros tra ĉi iom pli quickly-- estas preskaux la ekzakta ekvivalento de Fread krom ĝi estas por skribado anstataŭe de legado, nur kiel la alia lando ni havis malfermita kaj proksima, akiri karaktero, Skribi karaktero. Nun estas akiri arbitran kvanto de informo, dekstra arbitra kvanto de informo. Do ĝuste kiel antaŭe, ni povas havas aron de 10 entjeroj kie ni jam havas informo stokita, eble. Ĝi estis verŝajne kelkaj linioj de kodo kiuj devus iri inter tiuj du Kie mi plenigos arr kun io signfa. Mi plenigos ĝin per 10 malsamaj entjeroj. Kaj anstataŭe, kio mi estas faras estas skribanta de arr kaj kunigis informojn de arr. Kaj mi prenas tiun informon kaj metante ĝin en la dosiero. Do anstataŭe de ĝi estante el la dosieron al la bufro, ni nun irante de la bufro al la dosiero. Do estas nur la dorsflanko. Do denove, samkiel antaŭe, ni povas ankaŭ havas amaso bloko de memoro ke ni dinamike asignitaj kaj legis el tiu kaj skribu ke por la dosiero. Kaj ni ankaŭ havas ununuran variablon kapablas tenante unu bajto de informoj, kiel ekzemple karaktero. Sed denove, ni devas pasi en la adreso de tiu variablo kiam ni volas legi gxin. Do ni povas skribi la informojn ni trovas en tiu adreso al la dosiero pointer, PTR. Ekzistas multaj aliaj granda dosiero / S funkcioj ke fari diversajn aferojn krom la ones ni parolis hodiaŭ. Paro de la ones vi eble trovos utila estas fgets kaj fputs, kiu estas la ekvivalenta de fgetc kaj fputc sed por legi sola kordo de dosiero. Anstataŭe de ununura karaktero, ĝi legos tutan ĉenon. fprintf, kiu esence permesas vi uzi printf skribi al dosiero. Do kiel vi povas fari la ŝanĝiĝema anstataŭo uzante la anstataŭiloj procentoj i kaj procento d, kaj tiel plu, kun printf Vi povas simile prenas la printf kordo kaj presaĵo ion kiel tiu al dosiero. fseek-- se vi havas DVD ludanto estas la analogio mi kutime uzas here-- Estas ia kiel uzi vian malantaŭenigi kaj rapida antaŭen butonoj movi ĉirkaŭ la filmo. Simile, vi povas movi la dosieron. Unu el la aĵoj interne ke dosiero strukturo ke c kreas por vi estas indikilo de kie vi estas en la dosiero. Ĉu vi ĉe la tre komencante, je bajto nulo? Ĉu vi en bajto 100, bajto 1.000, kaj tiel plu? Vi povas uzi fseek arbitre movas ke indikilo antaŭen aŭ malantaŭen. Kaj ftell, denove simila al DVD ludanto, Estas kiel malgranda horloĝo kiu rakontas vi kiom da minutoj kaj sekundoj vi estas en aparta filmo. Simile, ftell diras vin kiel da bitokoj vi estas en la dosiero. feof estas malsama versio de eltrovanta ĉu vi havas atingis la finon de la dosiero. Kaj ferror estas funkcio ke vi povas uzi eltrovi ĉu io devas fuŝiĝis laborista kun dosiero. Denove, tio estas nur gratante la surfaco. Restas multa pli dosiero / S funkciojn en la norma io.h. Sed ĉi tio verŝajne akiri vin eklaboris kun dosiero punteros. Mi Doug Lloyd. Jen CS50.