1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [File I / O] 2 00:00:02,000 --> 00:00:04,000 [Jason Hirschhorn, Harvardo universitetas] 3 00:00:04,000 --> 00:00:07,000 [Tai CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Kai mes galvojame apie failą, kas ateina į galvą, yra "Microsoft Word" dokumentas, 5 00:00:11,000 --> 00:00:14,000 JPEG arba MP3 daina, 6 00:00:14,000 --> 00:00:17,000 ir mes bendraujame su kiekviena iš šių tipų failus įvairiais būdais. 7 00:00:17,000 --> 00:00:20,000 Pavyzdžiui, "Word" dokumentą, pridėti tekstą 8 00:00:20,000 --> 00:00:24,000 o su JPEG vaizdas gali apkarpyti kraštus arba retušuoti spalvas. 9 00:00:24,000 --> 00:00:28,000 Tačiau po gaubtu visus failus į savo kompiuterį, yra nieko daugiau, 10 00:00:28,000 --> 00:00:31,000 nei nulių ir ilgą seką. 11 00:00:31,000 --> 00:00:33,000 Tai su konkrečia programa, kuri sąveikauja su failu 12 00:00:33,000 --> 00:00:38,000 nuspręsti, kaip tvarkyti šią ilgą seką ir pateikti ją į vartotojo. 13 00:00:38,000 --> 00:00:41,000 Viena vertus, dokumentas gali atrodyti ne tik vienas baitas, 14 00:00:41,000 --> 00:00:45,000 arba 8 nuliai ir tie, ir rodyti ASCII simbolių ekrane. 15 00:00:45,000 --> 00:00:48,000 Kita vertus, rastrinis vaizdas gali atrodyti po 3 baitų 16 00:00:48,000 --> 00:00:50,000 arba 24 nulių ir, 17 00:00:50,000 --> 00:00:53,000 ir interpretuoti juos kaip 3 šešioliktainius skaitmenis 18 00:00:53,000 --> 00:00:56,000 kurios atstovauja raudonos, žalios ir mėlynos spalvų reikšmes 19 00:00:56,000 --> 00:00:58,000 vieno pikselio vaizdą. 20 00:00:58,000 --> 00:01:01,000 Ką jie gali atrodyti ekrane, jų esmė, 21 00:01:01,000 --> 00:01:05,000 failai yra nieko daugiau, nei nulių ir seka. 22 00:01:05,000 --> 00:01:08,000 Taigi, galime pasinerti ir pažvelgti, kaip mes iš tikrųjų manipuliuoti šiais nulių ir 23 00:01:08,000 --> 00:01:12,000 kai jis ateina į raštu ir skaitymo iš failo. 24 00:01:12,000 --> 00:01:15,000 >> Aš pradėti reikia suskirstyti į paprastą 3-dalių procesas. 25 00:01:15,000 --> 00:01:19,000 Be to, aš pasinerti į dviejų kodų pavyzdžių, kad įrodyti šių trijų dalių. 26 00:01:19,000 --> 00:01:23,000 Galiausiai, aš peržiūrėti procesą ir vieni iš svarbiausių informacijos. 27 00:01:23,000 --> 00:01:25,000 Kaip ir su bet kokio failo, kad sėdi ant savo darbalaukio, 28 00:01:25,000 --> 00:01:28,000 pirmas dalykas, kurį reikia padaryti, tai, kad jį atidarytumėte. 29 00:01:28,000 --> 00:01:31,000 In C, mes tai darome skelbiantis žymiklį į iš anksto struct 30 00:01:31,000 --> 00:01:33,000 , kuri atstovauja failą diske. 31 00:01:33,000 --> 00:01:38,460 Šiuo skambinimo funkcijos, mes taip pat nuspręsti, ar norime rašyti arba skaityti iš failo. 32 00:01:38,460 --> 00:01:41,660 Be to, mes faktinį skaitymo ir rašymo. 33 00:01:41,660 --> 00:01:44,800 Yra specializuotų funkcijų skaičius, mes galime naudoti šioje dalyje, 34 00:01:44,800 --> 00:01:48,790 ir beveik visi iš jų prasideda raide F, kuris stovi failui. 35 00:01:48,790 --> 00:01:53,560 Paskutinis, panašus į raudonos X viršutiniame kampe failus atidaryti jūsų kompiuteryje, 36 00:01:53,560 --> 00:01:56,680 mes uždarykite failą su galutiniu skambinimo funkcijos. 37 00:01:56,680 --> 00:01:59,540 Dabar, mes turime bendrą idėją apie tai, ką mes ketiname daryti, 38 00:01:59,540 --> 00:02:02,000 tegul neria į kodą. 39 00:02:02,000 --> 00:02:06,100 >> Šiame kataloge, mes turime dvi C failus ir jų atitinkamas paleidþiamieji failai. 40 00:02:06,100 --> 00:02:09,710 Rašomoji mašinėlė programa trunka vieną komandinės eilutės argumentas, 41 00:02:09,710 --> 00:02:12,060 dokumento pavadinimas, mes norime sukurti. 42 00:02:12,060 --> 00:02:16,160 Šiuo atveju, mes jį vadiname tai doc.txt. 43 00:02:16,160 --> 00:02:19,080 Leiskite paleisti programą ir įveskite keletą eilučių. 44 00:02:19,080 --> 00:02:23,660 Hi. Mano vardas Jason. 45 00:02:23,660 --> 00:02:26,710 Galiausiai, mes įvesti "mesti". 46 00:02:26,710 --> 00:02:29,720 Jei mes dabar išvardyti visus failus šiame kataloge, 47 00:02:29,720 --> 00:02:33,770 matome, kad naujas dokumentas, vadinamas doc.txt. 48 00:02:34,190 --> 00:02:36,110 Kad ši programa tiesiog sukurtas failas. 49 00:02:36,110 --> 00:02:40,520 Ir, žinoma, ji taip pat yra nieko daugiau nei nulių ir ilgą seką. 50 00:02:41,100 --> 00:02:43,260 Jei mes atidaryti šį naują failą, 51 00:02:43,260 --> 00:02:45,870 matome 3 eilutes kodo Mes įrašytas į mūsų programą - 52 00:02:46,060 --> 00:02:49,060 Hi. Gegužės vardas Jason. 53 00:02:49,580 --> 00:02:52,090 Bet tai, kas iš tikrųjų vyksta, kai typewriter.c veikia? 54 00:02:52,810 --> 00:02:55,520 Pirmoje eilutėje palūkanų už mus yra linija 24. 55 00:02:55,560 --> 00:02:58,490 Šioje eilutėje, mes pareiškiame savo failo žymeklį. 56 00:02:59,080 --> 00:03:03,140 Funkcija, kuri grąžina šį žymeklį, fopen, trunka du argumentus. 57 00:03:03,140 --> 00:03:07,440 Pirmasis failo pavadinimas, įskaitant, jeigu reikia, failo plėtinys. 58 00:03:07,440 --> 00:03:10,980 Prisiminkite, kad failo plėtinys neturi įtakos ne žemiausio lygio failą. 59 00:03:10,980 --> 00:03:14,640 Mes visada susiduriame su nulių ir ilgą seką. 60 00:03:14,640 --> 00:03:19,630 Tačiau ji veikia kaip failai yra interpretuojami ir ką aplikacijos yra naudojamos jas atidaryti. 61 00:03:19,630 --> 00:03:22,290 Antrasis argumentas fopen vienos raidės 62 00:03:22,290 --> 00:03:25,300 , kuris stovi už tai, ką mes planuojame daryti po to, kai mes atidaryti failą. 63 00:03:25,300 --> 00:03:30,630 Yra trys galimybės šį argumentą - W, R, A. 64 00:03:30,630 --> 00:03:34,900 Mes pasirinkome w šiuo atveju, nes norime įrašyti į failą. 65 00:03:34,900 --> 00:03:38,820 R, kaip jums greičiausiai gali atspėti, skaityti failo. 66 00:03:38,820 --> 00:03:41,760 Ir pridedant prie bylos. 67 00:03:41,760 --> 00:03:44,960 Nors abu, ir gali būti naudojamas rašyti į failus, 68 00:03:44,960 --> 00:03:47,460 , pradėti rašyti nuo bylos pradžios 69 00:03:47,460 --> 00:03:50,810 ir potencialiai perrašyti visus duomenis, kurie anksčiau buvo saugomi. 70 00:03:50,810 --> 00:03:54,070 Pagal nutylėjimą, failo mes atidaryti, jei ji nėra jau egzistuoja, 71 00:03:54,070 --> 00:03:57,180 yra sukurta mūsų darbo kataloge. 72 00:03:57,180 --> 00:04:00,540 Tačiau, jei norime atidaryti ar sukurti failą į kitą vietą, 73 00:04:00,540 --> 00:04:02,650 pirmą argumentą fopen, 74 00:04:02,650 --> 00:04:05,840 mes gali nurodyti kelią iki failo, be failo pavadinimo. 75 00:04:05,840 --> 00:04:09,490 Nors pirmasis šio proceso dalis yra tik viena eilutė ilgomis, 76 00:04:09,490 --> 00:04:12,350 ji visada gera praktika apima kitą linijų rinkinį 77 00:04:12,350 --> 00:04:15,930 kad patikrinti, siekiant užtikrinti, kad failas buvo sėkmingai atidarytas, ar sukurta. 78 00:04:15,930 --> 00:04:20,300 Jei fopen grąžina NULL, mes nenorime išsiveržti į priekį mūsų programoje, 79 00:04:20,300 --> 00:04:23,270 ir tai gali atsitikti taip, jei operacinė sistema yra iš atminties 80 00:04:23,270 --> 00:04:27,940 arba, jei mes bandome atidaryti failą į katalogą, kuriam mes neturėjo tinkamas teises. 81 00:04:27,940 --> 00:04:31,780 >> Du šio proceso dalis vyksta rašomųjų mašinėlių while cikle. 82 00:04:31,780 --> 00:04:35,000 Mes naudojame CS50 bibliotekos funkcija, gauti informacijos iš vartotojo, 83 00:04:35,000 --> 00:04:37,190 ir darant prielaidą, kad jie nenori mesti programą, 84 00:04:37,190 --> 00:04:41,940 mes naudojame funkcijos fputs imtis eilutę ir rašyti į failą. 85 00:04:41,940 --> 00:04:46,700 fputs yra tik viena iš daugelio funkcijų, mes galime naudoti įrašyti į failą. 86 00:04:46,700 --> 00:04:51,920 Kiti įtraukti fwrite, fputc, ir net fprintf. 87 00:04:51,920 --> 00:04:54,840 Nepriklausomai nuo to, konkrečiai funkcijai, mes galų gale naudojant, nors, 88 00:04:54,840 --> 00:04:57,480 visi jie turi žinoti, per savo argumentus, 89 00:04:57,480 --> 00:04:59,670 bent du dalykai - 90 00:04:59,670 --> 00:05:03,140 tai, kas turi būti parašyta ir kur tai turi būti parašyta, kad. 91 00:05:03,140 --> 00:05:07,240 Mūsų atveju, įvesti, yra seka, kad turi būti parašytas 92 00:05:07,240 --> 00:05:11,290 ir fp yra žymeklis, kad nukreipia mus ten, kur mes norime. 93 00:05:11,290 --> 00:05:15,330 Šioje programoje, du šio proceso dalis yra gana paprasta. 94 00:05:15,330 --> 00:05:17,360 Mes tiesiog eilutę iš vartotojo 95 00:05:17,360 --> 00:05:22,120 ir įtraukti jį tiesiogiai mūsų failą su mažai ne input validation ar saugumo patikrinimai. 96 00:05:22,120 --> 00:05:26,160 Dažnai, tačiau antroji dalis bus užimti didžiąją dalį savo kodą. 97 00:05:26,160 --> 00:05:30,580 Galiausiai, trečioji dalis yra 58 on-line, kur mes uždarykite failą. 98 00:05:30,580 --> 00:05:34,860 Čia mes vadiname fclose ir perduoti jį mūsų originalaus failo žymiklį. 99 00:05:34,860 --> 00:05:39,500 Vėlesnio eilutėje, mes grįžtame nulis, signalizacijos mūsų programos pabaigą. 100 00:05:39,500 --> 00:05:42,630 Ir taip, trečioji dalis yra taip paprasta, kaip kad. 101 00:05:42,630 --> 00:05:45,260 >> Pereikime skaityti iš failų. 102 00:05:45,260 --> 00:05:48,220 Atgal į mūsų katalogą, mes turime failą pavadinimu printer.c. 103 00:05:48,220 --> 00:05:50,910 Leiskite paleisti jį mes ką tik sukūrėte failą - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Ši programa, kaip rodo pavadinimas, tiesiog atspausdinti failo turinys perduota. 106 00:05:58,150 --> 00:06:00,230 Ir ten mes turime. 107 00:06:00,230 --> 00:06:03,780 Kodo eilutės buvo atspausdintos anksčiau ir išsaugotas doc.txt. 108 00:06:03,780 --> 00:06:06,980 Hi. Mano vardas Jason. 109 00:06:06,980 --> 00:06:09,120 Jei mes neria į printer.c, 110 00:06:09,120 --> 00:06:13,570 matome,, kad daug kodo atrodo panašus į ką mes ką tik vaikščiojo per typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Iš tiesų, 22 eilutė, kur mes atidarytas failas, 112 00:06:16,720 --> 00:06:19,220 ir linijos 39, kur mes baigė bylą, 113 00:06:19,220 --> 00:06:23,890 abu beveik identiškas typewriter.c, išskyrus fopen antrąjį argumentą. 114 00:06:23,890 --> 00:06:26,510 Šį kartą, mes skaityti iš failo, 115 00:06:26,510 --> 00:06:29,040 todėl mes pasirinkome r vietoj w. 116 00:06:29,040 --> 00:06:31,950 Taigi, galime sutelkti dėmesį į antrojo proceso dalis. 117 00:06:31,950 --> 00:06:36,060 Atitinka 35, kaip numatyta antroji sąlyga mūsų 4 kilpa, 118 00:06:36,060 --> 00:06:38,590 skambinti fgets 119 00:06:38,590 --> 00:06:42,190 kompanionas funkcija fputs nuo iki. 120 00:06:42,190 --> 00:06:44,660 Šį kartą mes turime tris argumentus. 121 00:06:44,660 --> 00:06:48,810 Pirmasis rodyklė į masyvo rašmenimis, jei eilutė bus saugomi. 122 00:06:48,810 --> 00:06:52,670 Antra, Maksimalus simbolių skaičius turi būti skaitoma. 123 00:06:52,670 --> 00:06:56,010 O trečiasis yra žymiklį į failą, su kuriais mes dirbame. 124 00:06:56,010 --> 00:07:00,780 Jūs pastebėsite, kad už linijos baigiasi, kai fgets grąžina NULL. 125 00:07:00,780 --> 00:07:02,940 Yra dvi priežastis, kad tai galėjo atsitikti. 126 00:07:02,940 --> 00:07:05,380 Pirma, klaida galėjo įvykti. 127 00:07:05,380 --> 00:07:10,740 Antra, ir labiau tikėtina, failo pabaigoje pasiekė ir buvo perskaityti ne daugiau simbolių. 128 00:07:10,740 --> 00:07:14,040 Tuo atveju, jei jums įdomu, dvi funkcijos egzistuoja, kad leidžia mums pasakyti 129 00:07:14,040 --> 00:07:17,160 šios priežasties yra šiuo konkrečiu NULL pointeris priežastis. 130 00:07:17,160 --> 00:07:21,090 Ir nenuostabu, nes jie turi daryti su darbo su failais, 131 00:07:21,090 --> 00:07:26,940 tiek ferror funkcija ir feof funkcija pradžia raide f. 132 00:07:26,940 --> 00:07:32,130 >> Galiausiai, prieš galime daryti išvadą, vienas greitas pastaba apie failą funkcija pabaigoje, 133 00:07:32,130 --> 00:07:36,690 , kuris, kaip ką tik minėjau, yra parašyta, kaip feof. 134 00:07:36,690 --> 00:07:41,550 Dažnai jums rasti sau naudojant, o ir kilpų palaipsniui skaityti savo kelią per failus. 135 00:07:41,550 --> 00:07:45,790 Taigi, jums reikės būdas baigti šias kilpas, po to, kai jūs pasieksite iš šių failų pabaigą. 136 00:07:45,790 --> 00:07:50,510 Kreipiamės į failų rodyklė feof ir patikrinti, norėdami pamatyti, jei tai tiesa, 137 00:07:50,510 --> 00:07:52,310 būtų padaryti tik tai. 138 00:07:52,310 --> 00:07:59,820 Taigi, while cikle, su sąlyga (! Feof (fp)) gali atrodyti kaip visiškai tinkamą sprendimą. 139 00:07:59,820 --> 00:08:03,770 Tačiau, tarkime, mes turime vieną eilutę liko mūsų tekstinį failą. 140 00:08:03,770 --> 00:08:07,130 Mes įvesti mūsų while cikle, ir viskas bus taip, kaip planuota. 141 00:08:07,130 --> 00:08:12,750 Kitam susitikimui per mūsų programa bus patikrinti, norėdami pamatyti, jei feof fp tiesa, 142 00:08:12,750 --> 00:08:15,430 bet - ir tai yra esminis dalykas, suprasti čia - 143 00:08:15,430 --> 00:08:17,770 ji negali būti tiesa, tik dar. 144 00:08:17,770 --> 00:08:21,110 Tai todėl, kad feof tikslas yra ne patikrinti 145 00:08:21,110 --> 00:08:24,400 jei kitas kvietimas skaityti funkcija bus hit failo pabaigoje, 146 00:08:24,400 --> 00:08:28,190 , o patikrinti, ar bylos pabaiga jau pasiekė. 147 00:08:28,190 --> 00:08:30,140 Šiame pavyzdyje, 148 00:08:30,140 --> 00:08:32,780 skaitant paskutinę eilutę mūsų failo eina puikiai sklandžiai, 149 00:08:32,780 --> 00:08:36,210 , bet programa dar nežino, kad mes nukentėjo mūsų failo pabaigą. 150 00:08:36,210 --> 00:08:40,549 Tai nėra, kol ji vieną papildomą skaityti, kad jis skaitikliai failo pabaigoje. 151 00:08:40,549 --> 00:08:43,210 Taigi, teisingas būtų toks: 152 00:08:43,210 --> 00:08:49,330 fgets ir jo trys argumentai - produkcija, produkcijos dydis, ir FP - 153 00:08:49,330 --> 00:08:52,570 ir visi, kad nėra lygi NULL. 154 00:08:52,570 --> 00:08:55,260 Tai mūsų požiūris ėmėsi printer.c, 155 00:08:55,260 --> 00:08:57,890 ir šiuo atveju, po kilpa išėjimų, 156 00:08:57,890 --> 00:09:04,290 būtų galima pavadinti feof arba ferror informuoti naudotoją į konkrečią argumentais išsivaduoti šio ciklo. 157 00:09:04,290 --> 00:09:08,100 >> Raštu ir skaitymo iš failo, jo Svarbiausio 158 00:09:08,100 --> 00:09:10,150 paprastas 3-dalių procesas. 159 00:09:10,150 --> 00:09:12,530 Pirma, mes atidaryti failą. 160 00:09:12,530 --> 00:09:16,740 Antra, mes įdėti kai kurių dalykų į mūsų bylą arba imtis kai kurių dalykų iš jo. 161 00:09:16,740 --> 00:09:19,200 Trečia, turime uždarykite failą. 162 00:09:19,200 --> 00:09:21,170 Pirmasis ir paskutinysis dalys yra lengva. 163 00:09:21,170 --> 00:09:23,920 Vidurinioji dalis yra keblus dalykų yra. 164 00:09:23,920 --> 00:09:27,760 Ir nors po gaubtu mes visada susiduriame su nulių ir ilgą seką, 165 00:09:27,760 --> 00:09:30,710 ji padeda kai kodavimo pridėti abstraktųjį 166 00:09:30,710 --> 00:09:35,350 , kuris paverčia seką į kažką, kad labiau panaši į tai, ką mes įpratę. 167 00:09:35,350 --> 00:09:39,570 Pavyzdžiui, jei mes dirbame su 24-bit bitmap failo, 168 00:09:39,570 --> 00:09:43,290 mes greičiausiai bus skaitant arba raštu vienu metu trys baitai. 169 00:09:43,290 --> 00:09:46,450 Tokiu atveju, būtų prasminga nustatyti ir tinkamai pavadinti 170 00:09:46,450 --> 00:09:48,980 struct, kad yra 3 baitų didelis. 171 00:09:48,980 --> 00:09:51,410 >> Nors darbo su failais gali atrodyti sudėtinga, 172 00:09:51,410 --> 00:09:54,530 naudojant juos leidžia mums padaryti kažką tikrai nuostabaus. 173 00:09:54,530 --> 00:09:58,880 Mes galime pakeisti padėtį pasaulyje, už mūsų programos, 174 00:09:58,880 --> 00:10:01,730 mes galime sukurti kažką, kad gyvena už mūsų programos gyvenimą, 175 00:10:01,730 --> 00:10:07,190 ar mes galime ką nors pakeisti, kuris buvo sukurtas prieš mūsų programa paleista. 176 00:10:07,190 --> 00:10:11,210 Bendrauja su failais, yra tikrai galinga programavimo dalis C. 177 00:10:11,210 --> 00:10:15,300 ir aš džiaugiamės, kad pamatytumėte, ką jūs ketinate sukurti su ja kodą. 178 00:10:15,300 --> 00:10:19,770 Mano vardas Jason Hirschhorn. Tai CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Juokas] 181 00:10:25,940 --> 00:10:29,330 Gerai. Vienu ypu. Čia mes einame. 182 00:10:49,000 --> 00:10:52,140 Kai mes galvojame apie failą - >> Oi, palauk. Atsiprašau. 183 00:10:52,140 --> 00:10:56,800 [Juokas] Gerai. 184 00:11:06,620 --> 00:11:09,970 Hey there. 185 00:11:13,670 --> 00:11:16,310 Kai mes galvojame apie failą 186 00:11:17,610 --> 00:11:20,710 Jei manote, failą - Gerai. Pasakyk man, kai būsite pasiruošę. 187 00:11:20,710 --> 00:11:22,520 O, nuostabu. 188 00:11:22,520 --> 00:11:26,180 Nors skaityti iš teleprompter gali atrodyti - ne. Mano blogai.