SPEAKER: Deri më tani, është e mundshme se shumica e programeve tuaja kanë qenë pak kalimtare. Ju drejtuar një program si Mario ose babëzitur. Ajo bën diçka, ajo ndoshta bën përdoruesi për disa informata, shtypura disa dalje në ekran, por pastaj kur programi juaj është e gjatë, nuk ka të vërtetë nuk ka prova atje ajo ishte e drejtuar ndonjëherë në vendin e parë. Unë do të thotë, i sigurt, ju mund të keni lënë ajo të hapet në dritare terminali, por në qoftë se ju të qartë ekranin tuaj, nuk ka me të vërtetë nuk ka prova se ka ekzistuar. Ne nuk kemi një mjet për ruajtjen informacion këmbëngulës, informacioni që ekziston pas tonë Programi ka ndaluar drejtimin, ose ne nuk kemi deri në këtë pikë. Për fat të mirë edhe pse, c bën na japin me aftësinë për të bërë këtë nëpërmjet zbatimit diçka që quhet një skedar, një strukturë që në thelb paraqet një skedar që ju do të dyfishtë klikoni në kompjuterin tuaj, nëse ju jeni përdoret për një përdorues mjedis grafik. Në përgjithësi kur punojnë me c, Ne jemi të vërtetë do të jetë duke punuar me pointers për files-- fotografi stars-- me përjashtim të pak kur flasim për një çift nga funksionet që punojnë me fotografi pointers. Ju nuk keni nevojë për të kanë hapur me të vërtetë shumë thellë në të kuptuarit pointers vetë. Ka pak vockël ku ne do të flasim rreth tyre, por në përgjithësi fotografi pointers dhe pointers, ndërsa të ndërlidhura, nuk janë saktësisht e njëjta gjë. Tani çfarë dua të them kur Unë them të dhënat e vazhdueshme? Çfarë është të dhënat e vazhdueshme? Pse nuk kemi kujdes për këtë? Thuaj, për shembull, se ju jeni drejtimin e një programi apo ju keni rishkruar një program që është një lojë, dhe ju doni të mbani gjurmët të gjitha lëvizjet e përdoruesit kështu që ndoshta nëse diçka shkon keq, ju mund të shqyrtojë dosjen pas ndeshjes. Kjo është ajo që ne do të thotë kur ne flasin për të dhëna të vazhdueshme. Në rrjedhën e drejtimin tuaj program, një skedar është krijuar. Dhe kur programi juaj ka ndaluar drejtimin, se dosja ende ekziston në sistemin tuaj. Dhe ne mund të shikoni në atë dhe të shqyrtojë atë. Dhe kështu që programi do të jetë i vendosur për të kanë krijuar disa të dhëna të vazhdueshme, të dhëna ekzistojnë pas programit ka përfunduar running. Tani të gjitha këto funksione që punojnë me krijuar fotografi dhe manipulimin ata në mënyra të ndryshme jetojnë në io.h standarde, i cili është një kokë skedar që ju keni qenë shumë gjasa paund përfshirë në krye të mjaft shumë të gjitha programet tuaja sepse ajo përmban një nga Funksionet më të dobishme për ne, printf, që gjithashtu ju lejon jeton në io.h. standarde Pra, ju nuk keni nevojë të paund përfshirë ndonjë fotografi të tjera ndoshta në mënyrë që të punojnë me fotografi pointers. Tani çdo funksion i vetëm skedar akrep, ose çdo skedar të vetëm I / O, output input funksion, e pranon si një i parametrave të tij apo të inputeve një pointer-- skedar përveç për një, fopen, e cila është ajo që ju përdorni për të marrë dosjen akrep në vendin e parë. Por, pasi ju keni hapi paraqesë dhe të merrni fotografi pointers, atëherë ju mund të kalojë ato si Argumentet në funksione të ndryshme ne do të flasim për sot, si edhe shumë të tjerë kështu që ju mund të punoni me fotografi. Pra, ka gjashtë goxha ato themelore të përbashkëta që ne do të flasim për sot. fopen dhe shoqëruesi i saj Funksioni fclose, fgetc dhe fputc saj funksion shoqërues, dhe fread dhe funksioni i saj shoqërues, fwrite. Pra, le të marrë të drejtë në të. fopen-- çfarë do të bëni? E pra, ajo hap një dosje dhe ajo ju jep një tregues file për të, kështu që ju mund të përdorni që atëherë paraqesë treguesin si argument me ndonjë file tjetër I / O funksionet. Gjëja më e rëndësishme për të kujtuar me fopen është që pasi të keni hapur paraqesë ose ka bërë një telefonatë si ajo këtu, ju duhet të kontrolloni për të siguruar se tregues që ju mori përsëri nuk është e barabartë me null. Nëse ju nuk e keni shikuar videon në pointers, kjo nuk mund të ketë kuptim. Por në qoftë se ju provoni dhe dereference një risjell null akrep, programi juaj ndoshta do të vuajnë një segmentimit [e padëgjueshme]. Ne duam të sigurohemi që ne mori një akrep prapa legjitim. Pjesa më e madhe e kohës ne do të kanë marrë një akrep legjitim prapa dhe kjo nuk do të jetë një problem. Pra, si nuk kemi bërë një thirrje për të fopen? Ajo duket shumë e shumë si kjo. Skeda yll ptr-- PTR qenë një gjenerik emër për dosjen pointer-- fopen dhe ne të kalojë në dy gjëra, një emër file dhe një operacion ne duam të ndërmarrë. Pra, ne mund të kemi një telefonatë që duket si this-- PTR skedar yll 1 barabartë fopen file1.txt. Dhe operacioni unë kam zgjedhur është r. Pra, çfarë mendoni se r është këtu? Cilat janë llojet e gjërave ne mund të jetë në gjendje të bëjë në fotografi? Pra, r është operacioni që ne zgjidhni kur ne duam të lexuar një file. Pra, ne do të në thelb kur ne kemi bërë një thirrje si kjo të bëhet veten një akrep skedarëve të tilla që ne pastaj mund të lexoni informacion nga file1.txt. Në mënyrë të ngjashme, ne mund të hapur fotografi 2.txt për të shkruar dhe kështu që ne mund të kalojë ptr2, skedari tregues që kam krijuar këtu, si një argument për çdo funksion që shkruan informatat në një skedar. Dhe të ngjashme me shkrim, ka gjithashtu mundësi për të append, një. Dallimi në mes shkrim dhe bashkëngjitur duke qenë se kur ju shkruani në një skedar, në qoftë se ju bëni një telefonatë për të fopen për të shkruar dhe se dosja tashmë ekziston, është e do të prishësh të gjithë dosjen. Ajo do të fillojë në fillim, fshirjes gjitha informatat kjo është tashmë atje. Ndërsa në qoftë se ju të hapur atë për bashkëngjitur, ajo do të shkojë deri në fund të skedarit në qoftë se ka tashmë në tekst ajo ose informacion në të, dhe kjo pastaj do të fillojë shkruar nga atje. Pra, ju nuk do të humbni ndonjë nga Informacioni që ju keni bërë më parë. Nëse ju dëshironi të shkruani ose append lloj varet nga situata. Por ju ndoshta do të dini se çfarë operacion drejtë është kur vjen koha. Pra, kjo është fopen. Po në lidhje me fclose? E pra, shumë e thjeshtë, fclose vetëm pranon file treguesin. Dhe si ju mund të presin, ajo mbyll këtë dosje. Dhe një herë ne kemi mbyllur një skedar, ne nuk mund të kryejnë ndonjë më shumë fotografi I / O funksioneve, lexim ose shkrim, në atë dosje. Ne duhet të ri-hapur paraqesë edhe një herë në mënyrë të vazhdojë të punojë me ajo duke përdorur I / O funksione. Mjetet Pra fclose ne jemi duke bërë duke punuar me këtë skedë. Dhe të gjithë ne kemi nevojë për të kaluar në është emri i një tregues file. Pra, në një çift slides më parë, ne fopened skedar 1 dot tekstin për lexim dhe ne të caktuar se paraqesin tregues të ptr1. Tani ne kemi vendosur ne jemi bërë e lexuar nga këtë dosje. Ne nuk duhet të bëjmë më me të. Ne mund ptr1 vetëm fclose. Dhe në mënyrë të ngjashme, mund të fclose ato të tjera. Në rregull. Pra, kjo është hapjes dhe mbylljes. Ata janë dy themelore duke filluar operacionet. Tani ne duam që në fakt të bëjë disa gjëra interesante, dhe funksioni i parë që ne do të të shihni se do të bëjë që është fgetc-- paraqesë të marrë një karakter. Kjo është ajo që fgetc përgjithësi do të përkthehet në. Qëllimi i saj në jetë është të lexoni karakterin e ardhshëm, ose në qoftë se kjo është shumë e juaj Thirrja e parë për fgetc për një fotografi të veçantë, karakteri i parë. Por pastaj pas kësaj, që ju të merrni një tjetër, karakteri shumë i ardhshëm i kësaj dosje, dhe dyqane atë në një variabël karakter. Siç e kemi bërë këtu, ch char barabartë fgetc, të kalojë në emër të një akrep file. Përsëri, kjo është shumë e rëndësishme këtu për të kujtuar që në mënyrë të ketë ky operacion të ketë sukses, skedari tregues vetë duhet të kem qenë e hapur për lexim. Ne nuk mund të lexojnë një karakter nga një skedar tregues hapëm për të shkruar. Pra, kjo është një nga më të Kufizimet e fopen, e drejtë? Ne duhet të kufizojnë veten vetëm për kryerjen e një operacion me një akrep file. Nëse ne të kërkuar për të lexuar dhe shkruaj nga të njëjtin skedar, ne do të kemi hapur dy të ndara fotografi në të njëjtën file-- pointers një për lexim, një për të shkruar. Pra, përsëri, vetëm arsyeja e Unë sjell se deri tani është sepse në qoftë se ne jemi duke shkuar për të bërë një telefonatë të fgetc, se duhet të kem skedar akrep qenë e hapur për lexim. Dhe pastaj goxha thjesht, të gjithë ne duhet të bëjmë është të kalojë në emrin e skedarit akrep. Pra, ch Char barabartë ptr1 fgetc. Kjo do të na marrë character-- tjetër ose përsëri, në qoftë se kjo është e para herë ne kemi bërë këtë thirrje, character-- e parë të çfarëdo file është theksuar nga ptr1. Kujtojnë se kjo ishte skedar 1 dot teksti. Ajo do të marrë karakterin e parë e që dhe ne do të ruajtur atë në ch ndryshueshme. Shumë i thjeshtë. Pra, ne kemi shikuar vetëm në tre funksionet dhe tashmë ne mund të bëjmë diçka mjaft i zoti. Pra, nëse ne kemi marrë këtë aftësi për të marrë një karakter dhe ne lak it-- kështu që ne të vazhdojë të marrë karaktere nga një skedar mbi dhe mbi dhe over-- tani ne mund të lexoni çdo të vetme Karakteri i një file. Dhe në qoftë se ne të shtypura çdo karakter menjëherë pas lexojmë atë, kemi lexuar tashmë nga një skedar dhe shtypur përmbajtjen e saj në ekran. Ne kemi concatenated në mënyrë efektive që dosja në ekran. Dhe kjo është ajo që Linux komandën cat bën. Nëse ju shkruani mace në emrin e file, atë do të shtypura nga të gjithë përmbajtjen i dosjes në dritaren tuaj terminalit. Dhe kështu kjo loop pak këtu, vetëm tre rreshta të kodit, por ajo në mënyrë efektive kopje identike komandën cat Linux. Pra, kjo sintaksë fuqi duket pak i çuditshëm, por këtu është ajo që po ndodh këtu. Ndërsa ch barabartë fgetc, PTR nuk është barabartë me EOF-- kjo është një kafshatë e tërë, por le të thyejnë atë poshtë vetëm kështu që është e qartë në sintaksë. Unë e kam konsoliduar atë për hir të hapësirës, edhe pse kjo është pak sintaksore ndërlikuar. Pra, kjo pjesë në të drejtën e gjelbër tani, çfarë është ajo duke bërë? E pra, kjo është vetëm thirrja jonë fgetc, e drejtë? Ne e kemi parë se më parë. Është marrë një karakter nga file. Pastaj ne krahasojmë se Karakteri kundër eof. EOF është një vlerë e veçantë që është përcaktohet në io.h standarte, i cili është fundi i skedarit karakterit. Pra, në thelb ajo që do të ndodhë është ky lak do të lexojë një karakter, krahasojnë atë me eof, The fund të file karakterit. Nëse ata nuk përputhen, kështu që ne nuk kemi arritur në fund të dosjes, ne do të shtypura atë karakter jashtë. Pastaj ne do të kthehemi me fillimi i lak përsëri. Ne do të marrë një karakter, kontrolloni kundër eof, print it out, dhe kështu me radhë dhe kështu me radhë e kështu me radhë, looping përmes në këtë mënyrë deri sa ne kemi arritur në fund të file. Dhe pastaj deri në atë pikë, ne do të kemi shtypur nga të gjithë përmbajtjen e dosjes. Pra, përsëri, ne kemi parë vetëm fopen, fclose, dhe fgetc dhe tashmë ne mund të kopjuar një komandë terminal Linux. Siç thashë në fillim, kemi pasur fgetc dhe fputc, dhe fputc ishte shok Funksioni i fgetc. Dhe kështu, si ju mund të imagjinoni, ajo është shkrimi ekuivalent. Kjo na lejon për të shkruar një karakter të vetëm në një skedar. Përsëri, caveat qenë, vetëm si ajo ishte me fgetc, dosja se ne jemi me shkrim të duhet të kem qenë e hapur për të shkruar ose për appending. Nëse ne përpiqemi dhe të përdorni fputc në një skedar se ne kemi hapur për lexim, ne jemi duke shkuar për të vuajtur pak e një gabimi. Por thirrja është shumë e thjeshtë. Kapitali fputc Një ptr2, gjithë që do të bëjë është ajo e do të shkruaj letër në një skedar në 2 pikë teksti, i cili ishte emri i paraqesë hapëm dhe caktuar tregues të ptr2. Pra, ne jemi duke shkuar për të shkruar një Kapitali Një të paraqesë 2 dot tekstin. Dhe ne do të shkruaj një thirrje pikë të paraqesë 3 dot teksti, i cili u vuri në dukje nga ptr3. Pra, përsëri, shumë i thjeshtë këtu. Por tani ne mund të bëjmë një tjetër gjë. Ne kemi këtë shembull ne ishim vetëm duke shkuar më shumë se për të qenë në gjendje për të replikuar cat Komandë Linux, ai që printime nga në ekran. E pra, tani që ne kemi aftësinë për të lexuar karaktere nga fotografi dhe shkruani karaktere të dosjeve, pse nuk kemi vetëm të zëvendësojë atë thirrje për printf me një thirrje për fputc. Dhe tani ne kemi dyfishta CP, një komandë shumë bazë Linux që kemi folur për rrugë të gjatë më parë në Linux komandat video të. Ne kemi në mënyrë efektive të dyfishta që e drejtë këtu. Ne jemi duke lexuar një karakter dhe pastaj ne jemi shkruar atë karakter në një tjetër fotografi. Leximi nga një skedar, shkrim në një tjetër, pa pushim pa pushim deri sa ne goditi EOF. Ne kemi marrë në fund të paraqesë ne jemi duke u përpjekur të kopjoni nga. Dhe nga kjo ne do të kemi shkruar të gjithë nga personazhet ne kemi nevojë për dosjen se ne jemi me shkrim për të. Pra, kjo është cp, kopja komanda Linux. Në fillim të kjo video, kisha caveat që ne do të flasim një pak për pointers. Këtu është veçanërisht ku ne jemi do të flasim për pointers përveç të paraqesë pointers. Pra, ky funksion duket lloj i frikshme. Ajo ka disa parametra. Ka shumë ndodh këtu. Ka shumë të ndryshme ngjyrat dhe tekste. Por me të vërtetë, kjo është vetëm Versioni i përgjithshëm i fgetc që na lejon të marrë ndonjë sasia e informacionit. Ajo mund të jetë pak i paefektshëm në qoftë se ne jemi duke marrë karaktere një në një kohë, iterating përmes file nje karakter në një kohë. Nuk do të jetë nicer për të marrë 100 në një kohë ose 500 në një kohë? E pra, fread dhe funksioni i saj shoqërues fwrite, të cilat ne do të flasim për në një të dytë, të na lejojë të bëjë vetëm se. Ne mund të lexoni një sasi arbitrare e informacionit nga një file dhe ne e ruajtur atë diku përkohësisht. Në vend të qenë në gjendje për të vetëm përshtaten atë në një variable të vetme, ne mund të kenë nevojë për të ruajtur atë në një rrjet. Dhe kështu, ne të kalojë në katër Argumentet për fread-- një akrep në vendin ku ne jemi duke shkuar për të ruajtur informacione, sa i madh çdo njësi e informacionit do të jetë, se sa njësitë e informacionit ne duam të blerë, dhe nga të cilat skedar ne duam për të marrë ato. Ndoshta më e mirë e ilustruar me një shembull këtu. Pra, le të themi se ne të deklarojë një grup prej 10 integers. Ne kemi deklaruar vetëm mbi rafte në mënyrë arbitrare int arr 10. Pra, kjo është shumë i thjeshtë. Tani ajo që ne po bëjmë edhe pse është frecall është ne jemi duke lexuar madhësinë e int kohët 10 bytes të informacionit. Madhësia e int qenies four-- kjo është madhësia e një numër të plotë në c. Pra, ajo që ne po bëjmë është që ne jemi duke lexuar 40 bytes vlerë e informacionit nga dosja vuri në dukje nga PTR. Dhe ne jemi ruajtjen ato 40 bytes diku ku ne kemi vënë mënjanë 40 bytes vlerë të kujtesës. Për fat të mirë, ne kemi bërë tashmë se nga deklaruar ARR, se array drejtë atje. Që është i aftë të mbajtjes 10 njësi katër-byte. Pra në total, ajo mund të mbajë 40 bytes vlerë e informacionit. Dhe ne jemi tani duke lexuar 40 bytes e informacionit nga dosjes, dhe ne jemi ruajtjen atë në arr. Kujtojnë nga video për pointers se emri i një grup, të tilla si arr, është me të vërtetë vetëm një akrep të elementit të parë. Pra, kur ne të kalojë në arr atje, ne janë, në fakt, duke kaluar në një tregues. Në mënyrë të ngjashme ne mund të bëjmë this-- ne nuk domosdoshmërisht nevojë për të shpëtuar tampon tonë në rafte. Ne gjithashtu mund të ndajë dinamike një tampon si kjo, duke përdorur malloc. Mos harroni, kur ne dinamike të siguroj kujtesë, ne jemi duke kursyer atë në grumbull, jo rafte. Por ajo është ende një tampon. Ajo ende, në këtë rast, është duke mbajtur 640 bytes i informacionit sepse një të dyfishtë merr tetë bytes. Dhe ne jemi duke kërkuar për 80 prej tyre. Ne duam që të ketë hapësirë për të mbajtur 80 dyshe. Pra, 80 herë 8 është 640 bytes informacion. Dhe kjo thirrje për fread është mbledhjen e 640 bytes të informacionit nga dosja vuri në dukje të nga PTR dhe ruajtjen atë tani në arr2. Tani ne mund të trajtojmë fread vetëm si një thirrje për fgetc. Në këtë rast, ne jemi vetëm duke u përpjekur për të marrë një karakter nga file. Dhe ne nuk kemi nevojë një grup për të mbajtur një karakter. Ne vetëm mund të ruajë atë në një variabël karakter. Kapur, megjithatë, është se kur ne vetëm duhet një ndryshore, ne kemi nevojë për të kaluar në Adresa e kësaj variable sepse kujtoj se Argumenti i parë për të fread është një tregues për vendin dhe kujtesës ku ne duam të ruajtur informacionin. Përsëri, emri i një array është një akrep. Pra, ne nuk kemi nevojë të bëjmë rrjet ampersand. Por c, karakteri c këtu, nuk është një grup. Është vetëm një variabël. Dhe kështu që ne kemi nevojë për të kaluar një c simbol për të treguar se kjo është adresa ku ne duam për të ruajtur këtë byte një informacioni, ky karakter ai që ne jemi mbledhur nga PTR. Fwrite-- unë do të shkoj nëpër kjo pak më shumë quickly-- është shumë e shumë ekuivalent i saktë i fread përveç se është për të shkruar në vend të leximit, vetëm si më other-- ne kemi pasur të hapur dhe të ngushtë, të marrë një karakter, shkruaj një karakter. Tani është marrë arbitrare sasia e informacionit, shumë të drejtë arbitrare e informacionit. Pra, ashtu si më parë, ne mund të kanë një rrjet të integers 10 ku ne tashmë kemi informacioni i ruajtur, ndoshta. Kjo ishte ndoshta disa rreshta të kodit që duhet të shkojë mes të këtyre dy ku kam mbush me arr diçka kuptimplotë. I mbushur atë me 10 integers të ndryshme. Dhe në vend të kësaj, ajo që unë jam duke bërë është shkruar nga arr dhe mbledhjen e informacionit nga arr. Dhe unë jam duke marrë atë informacion dhe duke i vënë atë në dosje. Pra, në vend të të qenit nga dosja për tampon, ne jemi tani duke shkuar nga tampon në dosjen. Pra, kjo është vetëm e kundërta. Pra, përsëri, ashtu si më parë, ne mund të gjithashtu kanë një copë grumbull kujtesës se ne kemi dinamike ndarë dhe të lexoni nga ajo dhe shkruajnë se në dosjen. Dhe ne gjithashtu kemi një variable të vetme e aftë të mbajnë një bajt e informacionit, të tilla si një karakter. Por përsëri, ne kemi nevojë për të kaluar në adresa e kësaj variable kur ne duam të lexojmë nga ajo. Pra, ne mund të shkruani informacionin ne gjejmë në atë adresë në fotografi akrep, PTR. Ka shumë të tjera fotografi i madh I / O funksionet që bëjnë gjëra të ndryshme përveç ato ne kemi biseduar për sot. Një çift nga ato ju mund të gjeni të dobishme janë fgets dhe fputs, të cilat janë ekuivalente e fgetc dhe fputc por për leximin një varg të vetëm nga një skedar. Në vend të një karakter të vetëm, ajo do të lexoni një varg të tërë. fprintf, e cila në thelb lejon ju për të përdorur printf për të shkruar të paraqesin. Pra, ashtu si ju mund të bëni të zëvendësim ndryshueshme përdorur placeholders për qind i dhe për qind d, dhe kështu me radhë, me printf ju në mënyrë të ngjashme mund të marrë string printf dhe të shtypura diçka si kjo në një skedar. fseek-- qoftë se ju keni një DVD player është analogjia unë zakonisht përdorin here-- është lloj i si duke përdorur tuaj rewind shpejtë përpara dhe butona për të lëvizur nëpër film. Në mënyrë të ngjashme, ju mund të lëvizin nëpër dosje. Një nga gjërat brenda se struktura e skedarëve se c krijon për ju është një tregues e ku je në dosjen. A jeni në shumë duke filluar, në bajt zero? A jeni në bajt 100, byte 1000, dhe kështu me radhë? Ju mund të përdorni për të lëvizur në mënyrë arbitrare fseek se tregues përpara ose prapa. Dhe ftell, përsëri të ngjashme me një DVD player, është si një orë të vogël që tregon ju sa minuta dhe sekonda ju janë në një film të caktuar. Në mënyrë të ngjashme, ftell ju tregon se si shumë bytes ju jeni në dosjen. feof është një version i ndryshëm për zbulimin e nëse ju keni arritur në fund të file. Dhe ferror është një funksion që ju mund të përdorni për të zbuluar nëse diçka ka shkuar punës gabuar me një file. Përsëri, kjo është vetëm kruarje sipërfaqe. Ka ende shumë më tepër skedar I / O funksionon në io.h. standarde Por kjo ndoshta do të merrni ju ka filluar punën me fotografi pointers. Unë jam Doug Lloyd. Kjo është CS50.