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, Hārvarda universitātes] 3 00:00:04,000 --> 00:00:07,000 [Tas ir CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Kad mēs domājam par failu, kas nāk prātā, ir Microsoft Word dokumentu, 5 00:00:11,000 --> 00:00:14,000 JPEG attēlu vai MP3 dziesmu, 6 00:00:14,000 --> 00:00:17,000 un mēs mijiedarboties ar katru no šiem failiem dažādos veidos veidiem. 7 00:00:17,000 --> 00:00:20,000 Piemēram, Word dokumentā mēs pievienot tekstu 8 00:00:20,000 --> 00:00:24,000 bet ar JPEG attēlu mēs varētu apgriezt no malas, vai retušēt krāsas. 9 00:00:24,000 --> 00:00:28,000 Vēl zem pārsega visiem mūsu datora failiem ir nekas vairāk 10 00:00:28,000 --> 00:00:31,000 nekā garš secību nullēm un uzņēmumiem. 11 00:00:31,000 --> 00:00:33,000 Tas ir atkarīgs no īpašo pieteikumu, kas mijiedarbojas ar failu 12 00:00:33,000 --> 00:00:38,000 izlemt, kā apstrādāt šo ilgi secību un iesniedz to lietotājam. 13 00:00:38,000 --> 00:00:41,000 No vienas puses, dokuments var apskatīt tikai vienu baitu, 14 00:00:41,000 --> 00:00:45,000 vai 8 nullēm un tiem, un parādīt ASCII rakstzīmi uz ekrāna. 15 00:00:45,000 --> 00:00:48,000 No otras puses, bitkartes attēls var apskatīt 3 baiti, 16 00:00:48,000 --> 00:00:50,000 vai 24 nullēm un tiem, 17 00:00:50,000 --> 00:00:53,000 un interpretēt tos kā 3 heksadecimālo skaitļu 18 00:00:53,000 --> 00:00:56,000 kas pārstāv vērtības sarkanā, zaļā un zilā krāsā 19 00:00:56,000 --> 00:00:58,000 vienā pikseļu attēla. 20 00:00:58,000 --> 00:01:01,000 Kādi tie varētu izskatīties uz ekrāna, to pamatā, 21 00:01:01,000 --> 00:01:05,000 faili ir nekas vairāk kā secību nullēm un uzņēmumiem. 22 00:01:05,000 --> 00:01:08,000 Tātad pieņemsim ienirt un skatīties, kā mēs patiesībā manipulēt ar šiem nullēm un tiem 23 00:01:08,000 --> 00:01:12,000 kad runa ir rakstiski un lasot no faila. 24 00:01:12,000 --> 00:01:15,000 >> Es sāktu ar sadalot to vienkāršu 3-daļa procesā. 25 00:01:15,000 --> 00:01:19,000 Tālāk, es ņemšu nodoties divās koda piemērus, kas pierāda šīs trīs daļas. 26 00:01:19,000 --> 00:01:23,000 Visbeidzot, es pārskatīt procesu un daži no tās svarīgākajiem detaļām. 27 00:01:23,000 --> 00:01:25,000 Tāpat kā ar jebkuru failu, kas atrodas uz darbvirsmas, 28 00:01:25,000 --> 00:01:28,000 pirmā lieta, kas jādara, ir, lai to atvērtu. 29 00:01:28,000 --> 00:01:31,000 C mēs darām, deklarējot rādītāju uz iepriekš struct 30 00:01:31,000 --> 00:01:33,000 kas pārstāv failu uz diska. 31 00:01:33,000 --> 00:01:38,460 Šajā funkciju zvanu, mēs arī izlemt, vai mēs gribam rakstīt vai lasīt no faila. 32 00:01:38,460 --> 00:01:41,660 Tālāk, mēs faktisko lasīšanu un rakstīšanu. 33 00:01:41,660 --> 00:01:44,800 Ir specializētas funkcijas skaits, mēs varam izmantot šajā daļā, 34 00:01:44,800 --> 00:01:48,790 un gandrīz visi no tiem sākas ar burtu F, kas apzīmē failu. 35 00:01:48,790 --> 00:01:53,560 Visbeidzot, līdzīgi maz sarkano X, kas augšējā stūrī failus atvērts jūsu datorā, 36 00:01:53,560 --> 00:01:56,680 Mēs slēgt failu ar galīgo funkciju zvanu. 37 00:01:56,680 --> 00:01:59,540 Tagad, kad mums ir vispārēju priekšstatu par to, ko mēs gatavojamies darīt, 38 00:01:59,540 --> 00:02:02,000 pieņemsim pikējošais kodu. 39 00:02:02,000 --> 00:02:06,100 >> Šajā direktorijā, mums ir divas C failus un to atbilstošās izpildāmos failus. 40 00:02:06,100 --> 00:02:09,710 Rakstāmmašīnas Programma ilgst vienu komandrindas argumentu, 41 00:02:09,710 --> 00:02:12,060 nosaukums, dokumenta mēs vēlamies izveidot. 42 00:02:12,060 --> 00:02:16,160 Šajā gadījumā, mēs to saucam doc.txt. 43 00:02:16,160 --> 00:02:19,080 Pieņemsim palaist programmu un ievadiet pāris līnijas. 44 00:02:19,080 --> 00:02:23,660 Hi. Mans vārds ir Jason. 45 00:02:23,660 --> 00:02:26,710 Visbeidzot, mēs tipa "atmest". 46 00:02:26,710 --> 00:02:29,720 Ja mēs tagad uzskaitīt visus failus šajā direktorijā, 47 00:02:29,720 --> 00:02:33,770 mēs redzam, ka jaunais dokuments grāmatiņa sauc doc.txt. 48 00:02:34,190 --> 00:02:36,110 Tas ir fails šī programma tikai izveidots. 49 00:02:36,110 --> 00:02:40,520 Un, protams, tas arī nav nekas vairāk kā ilgu secību nullēm un uzņēmumiem. 50 00:02:41,100 --> 00:02:43,260 Ja mēs atvērtu šo jauno failu, 51 00:02:43,260 --> 00:02:45,870 mēs redzam 3 rindiņas kodu mēs stājās mūsu programmā - 52 00:02:46,060 --> 00:02:49,060 Hi. Maijā vārds ir Jason. 53 00:02:49,580 --> 00:02:52,090 Bet to, kas patiesībā notiek, kad typewriter.c iet? 54 00:02:52,810 --> 00:02:55,520 Pirmajā rindā interese par mums ir līnija 24. 55 00:02:55,560 --> 00:02:58,490 Šajā līnijā, mēs apliecinām savu failu rādītāju. 56 00:02:59,080 --> 00:03:03,140 Funkcija, kas atgriež šo rādītāju, fopen, ņem divus argumentus. 57 00:03:03,140 --> 00:03:07,440 Pirmais ir faila nosaukums, ieskaitot faila paplašinājumu, ja vajadzīgs. 58 00:03:07,440 --> 00:03:10,980 Atgādināt, ka faila paplašinājums neietekmē failu savā zemākajā līmenī. 59 00:03:10,980 --> 00:03:14,640 Mēs vienmēr nodarbojas ar ilgu secību nullēm un uzņēmumiem. 60 00:03:14,640 --> 00:03:19,630 Bet tas ietekmē to, kā faili tiek interpretēts un kādi pieteikumi tiek izmantoti, lai atvērtu to. 61 00:03:19,630 --> 00:03:22,290 Otrs arguments, lai fopen ir viens burts 62 00:03:22,290 --> 00:03:25,300 kas apzīmē to, ko mēs plānojam darīt, kad mēs atvērt failu. 63 00:03:25,300 --> 00:03:30,630 Ir trīs iespējas šo argumentu - W, R, un A. 64 00:03:30,630 --> 00:03:34,900 Mēs esam izvēlējušies w šajā gadījumā, jo mēs vēlamies, lai rakstītu uz failu. 65 00:03:34,900 --> 00:03:38,820 R, kā jūs varat droši uzminēt, ir lasīšanas uz failu. 66 00:03:38,820 --> 00:03:41,760 Un ir pievienošanu lietas materiāliem. 67 00:03:41,760 --> 00:03:44,960 Kaut gan W un var izmantot, lai rakstītu uz failiem, 68 00:03:44,960 --> 00:03:47,460 w sāks rakstīt no sākuma failu 69 00:03:47,460 --> 00:03:50,810 un potenciāli pārrakstīt visus datus, kas jau iepriekš ir bijuši uzglabāti. 70 00:03:50,810 --> 00:03:54,070 Pēc noklusējuma faila mēs atveram, ja tā vēl nav, 71 00:03:54,070 --> 00:03:57,180 tiek radīts mūsu pašreizējā darba direktoriju. 72 00:03:57,180 --> 00:04:00,540 Taču, ja mēs gribam, lai piekļūtu vai izveidot failu citā vietā, 73 00:04:00,540 --> 00:04:02,650 pirmajā argumentu fopen, 74 00:04:02,650 --> 00:04:05,840 mēs varam norādīt faila ceļu papildus faila nosaukumu. 75 00:04:05,840 --> 00:04:09,490 Bet pirmā daļa šajā procesā ir tikai viena līnija koda ilgu, 76 00:04:09,490 --> 00:04:12,350 tas vienmēr ir laba prakse, lai iekļautu citu komplektu līniju 77 00:04:12,350 --> 00:04:15,930 ka pārbaude, lai nodrošinātu, ka fails tika veiksmīgi atvērta vai radīta. 78 00:04:15,930 --> 00:04:20,300 Ja fopen atgriež null, mēs negribētu veidot uz priekšu ar mūsu programmu, 79 00:04:20,300 --> 00:04:23,270 un tas var notikt, ja operētājsistēma ir no atmiņas 80 00:04:23,270 --> 00:04:27,940 vai, ja mēs mēģinātu atvērt failu direktoriju, par kuru mums nav pietiekamas atļaujas. 81 00:04:27,940 --> 00:04:31,780 >> Procesa otrās daļas notiek rakstāmmašīna s kamēr cilpa. 82 00:04:31,780 --> 00:04:35,000 Mēs izmantojam CS50 bibliotēkas funkciju, lai iegūtu informāciju no lietotāja, 83 00:04:35,000 --> 00:04:37,190 un pieņemot, ka viņi nevēlas, lai izietu no programmas, 84 00:04:37,190 --> 00:04:41,940 mēs izmantojam funkciju fputs veikt virkni un rakstīt to failu. 85 00:04:41,940 --> 00:04:46,700 fputs ir tikai viens no daudziem funkcijas mēs varētu izmantot, lai rakstītu uz failu. 86 00:04:46,700 --> 00:04:51,920 Citi ietver fwrite, fputc un pat fprintf. 87 00:04:51,920 --> 00:04:54,840 Neatkarīgi no konkrētā funkcija mēs galu galā, izmantojot, lai gan, 88 00:04:54,840 --> 00:04:57,480 visi no tiem ir jāzina, izmantojot savu argumentāciju, 89 00:04:57,480 --> 00:04:59,670 vismaz divas lietas - 90 00:04:59,670 --> 00:05:03,140 to, kas ir rakstīts un kur tai ir jābūt rakstīts. 91 00:05:03,140 --> 00:05:07,240 Mūsu gadījumā, ievade ir virkne, kas ir jāraksta 92 00:05:07,240 --> 00:05:11,290 un FP ir rādītājs, ka vada mūs tur, kur mēs esam rakstiski. 93 00:05:11,290 --> 00:05:15,330 Šajā programmā, no procesa otrā daļa ir diezgan vienkārša. 94 00:05:15,330 --> 00:05:17,360 Mēs vienkārši, ņemot virkni no lietotāja 95 00:05:17,360 --> 00:05:22,120 un pievienojot to tieši uz mūsu failu ar maz-to-nav ieejas apstiprināšana vai drošības pārbaudēm. 96 00:05:22,120 --> 00:05:26,160 Tomēr bieži daļa divi būs aizņem lielāko daļu savu kodu. 97 00:05:26,160 --> 00:05:30,580 Visbeidzot, daļa trīs ir par 58 līnijā, kur mēs aizveriet failu. 98 00:05:30,580 --> 00:05:34,860 Šeit mēs saucam fclose un nodot to mūsu sākotnējo faila rādītāju. 99 00:05:34,860 --> 00:05:39,500 Turpmākajos līnijas, mēs atgriežamies nulle, signalizācijas beigas mūsu programmā. 100 00:05:39,500 --> 00:05:42,630 Un, jā, daļa trīs ir tik vienkārši. 101 00:05:42,630 --> 00:05:45,260 >> Pieņemsim pāriet uz lasīšanu no failiem. 102 00:05:45,260 --> 00:05:48,220 Atpakaļ mūsu direktorijā mums ir failu sauc printer.c. 103 00:05:48,220 --> 00:05:50,910 Pieņemsim palaist to ar failu mēs tikko izveidotas - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Šī programma, kā norāda nosaukums, vienkārši izdrukāt no faila saturs nodotas to. 106 00:05:58,150 --> 00:06:00,230 Un tur mums ir tā. 107 00:06:00,230 --> 00:06:03,780 No koda līniju mums bija drukāti agrāk un saglabāts doc.txt. 108 00:06:03,780 --> 00:06:06,980 Hi. Mans vārds ir Jason. 109 00:06:06,980 --> 00:06:09,120 Ja mēs nodoties printer.c, 110 00:06:09,120 --> 00:06:13,570 mēs redzam, ka no koda partijas izskatās līdzīgs tam, ko mēs vienkārši gāja cauri jo typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Patiešām līnija 22, kur mēs atvērām failu, 112 00:06:16,720 --> 00:06:19,220 un līnija 39, kur mēs slēdza failu, 113 00:06:19,220 --> 00:06:23,890 ir gan gandrīz identiski typewriter.c, izņemot fopen otro argumentu. 114 00:06:23,890 --> 00:06:26,510 Šoreiz mēs esam lasījums no faila, 115 00:06:26,510 --> 00:06:29,040 tāpēc mēs esam izvēlējušies r vietā w. 116 00:06:29,040 --> 00:06:31,950 Tātad, pieņemsim koncentrēties uz otro daļu no procesa. 117 00:06:31,950 --> 00:06:36,060 35 līnija, kā otrais nosacījums mūsu 4 cilpas, 118 00:06:36,060 --> 00:06:38,590 Mēs piezvanīt uz fgets, 119 00:06:38,590 --> 00:06:42,190 biedrs funkcija fputs no pirms tam. 120 00:06:42,190 --> 00:06:44,660 Šoreiz mums ir trīs argumentus. 121 00:06:44,660 --> 00:06:48,810 Pirmais ir rādītājs uz masīvu rakstzīmju kur virkne tiks uzglabāti. 122 00:06:48,810 --> 00:06:52,670 Otrais ir maksimālais rakstzīmju skaits, ko lasīt. 123 00:06:52,670 --> 00:06:56,010 Un trešais ir rādītājs uz failu ar kuru mēs strādājam. 124 00:06:56,010 --> 00:07:00,780 Jūs pamanīsiet, ka, lai cilpa beidzas, kad fgets atgriež null. 125 00:07:00,780 --> 00:07:02,940 Ir divi iemesls, ka tas var būt noticis. 126 00:07:02,940 --> 00:07:05,380 Pirmkārt, kļūda var būt noticis. 127 00:07:05,380 --> 00:07:10,740 Otrkārt, un visticamāk, ka faila beigas tika sasniegts, un ne vairāk rakstzīmes tika lasīt. 128 00:07:10,740 --> 00:07:14,040 Gadījumā, ja jūs domājām, divas funkcijas pastāv, kas ļauj mums pateikt 129 00:07:14,040 --> 00:07:17,160 iemesla dēļ ir iemesls šim konkrētajam null rādītājs. 130 00:07:17,160 --> 00:07:21,090 Un nav pārsteigums, jo tie ir saistīti ar darbu ar failiem, 131 00:07:21,090 --> 00:07:26,940 gan ferror funkcija un feof funkcija sākas ar burtu f. 132 00:07:26,940 --> 00:07:32,130 >> Visbeidzot, pirms mēs secināt, viens ātrs piezīmi par beigām faila funkciju, 133 00:07:32,130 --> 00:07:36,690 kas, kā tikko minēts, ir rakstīts kā feof. 134 00:07:36,690 --> 00:07:41,550 Bieži vien jūs atradīsiet pats, izmantojot, bet gan cilpas pakāpeniski lasīt savu ceļu cauri failiem. 135 00:07:41,550 --> 00:07:45,790 Tātad, jums ir nepieciešams veids, lai izbeigtu šos cilpas pēc beigs šiem failiem. 136 00:07:45,790 --> 00:07:50,510 Aicinot feof no faila rādītāju un pārbaudes, lai redzētu, vai tā ir taisnība 137 00:07:50,510 --> 00:07:52,310 varētu darīt tieši to. 138 00:07:52,310 --> 00:07:59,820 Tādējādi, kamēr cilpa ar nosacījumu (! Feof (FP)) varētu šķist pilnīgi atbilstošu risinājumu. 139 00:07:59,820 --> 00:08:03,770 Taču, teiksim mums ir viena līnija palikusi mūsu teksta failu. 140 00:08:03,770 --> 00:08:07,130 Mēs ienākt mūsu kamēr cilpa un viss strādās, kā plānots. 141 00:08:07,130 --> 00:08:12,750 Uz nākamo kārtu caur mūsu programma pārbauda, ​​vai feof FP ir taisnība, 142 00:08:12,750 --> 00:08:15,430 bet - un tas ir kritiskais punkts, lai saprastu šeit - 143 00:08:15,430 --> 00:08:17,770 tas nebūs taisnība tikai vēl. 144 00:08:17,770 --> 00:08:21,110 Tas ir tāpēc, ka feof mērķis nav pārbaudīt 145 00:08:21,110 --> 00:08:24,400 Ja nākamais zvans uz lasīt funkciju dosies beigām failu, 146 00:08:24,400 --> 00:08:28,190 bet gan pārbaudīt, vai no faila beigas jau ir sasniegts. 147 00:08:28,190 --> 00:08:30,140 Attiecībā uz šo piemēru, 148 00:08:30,140 --> 00:08:32,780 lasot pēdējo līniju mūsu failu iet perfekti gludi, 149 00:08:32,780 --> 00:08:36,210 bet programmā nav vēl zināt, ka mēs esam hit beigas mūsu failu. 150 00:08:36,210 --> 00:08:40,549 Tas nav tikai tas viens papildu izlasīju, ka tas skaitītāji beigām failu. 151 00:08:40,549 --> 00:08:43,210 Tādējādi, pareizi nosacījums būtu šādi: 152 00:08:43,210 --> 00:08:49,330 fgets un tās trīs argumenti - izlaide, produkcijas izmēra, un FP - 153 00:08:49,330 --> 00:08:52,570 un visu, kas nav vienāds ar null. 154 00:08:52,570 --> 00:08:55,260 Šī pieeja ir mūsu uzņēma printer.c, 155 00:08:55,260 --> 00:08:57,890 un šajā gadījumā, pēc cilpas izejām, 156 00:08:57,890 --> 00:09:04,290 jūs varētu zvanīt feof vai ferror informēt lietotāju par to, īpaša pamatojuma izejai šo cilpu. 157 00:09:04,290 --> 00:09:08,100 >> Rakstiski un lasot no faila ir, pie tās svarīgākās, 158 00:09:08,100 --> 00:09:10,150 vienkāršs 3-daļa procesu. 159 00:09:10,150 --> 00:09:12,530 Pirmkārt, mēs atvērt failu. 160 00:09:12,530 --> 00:09:16,740 Otrkārt, mēs nodot dažas lietas vērā mūsu failu vai veikt dažas lietas no tā. 161 00:09:16,740 --> 00:09:19,200 Treškārt, mēs aizveriet failu. 162 00:09:19,200 --> 00:09:21,170 Pirmā un pēdējā daļas ir viegli. 163 00:09:21,170 --> 00:09:23,920 Vidusdaļā ir vieta, kur grūts sīkumi slēpjas. 164 00:09:23,920 --> 00:09:27,760 Un, lai gan zem pārsega mēs vienmēr nodarbojas ar ilgu secību nullēm un tiem, 165 00:09:27,760 --> 00:09:30,710 tas palīdz, kad kodēšanas, lai pievienotu slāni abstrakcijas 166 00:09:30,710 --> 00:09:35,350 kas pārvērš secība kaut ko, kas vairāk līdzinās ko mēs esam pieraduši redzēt. 167 00:09:35,350 --> 00:09:39,570 Piemēram, ja mēs strādājam ar 24 bitu bitmap failu, 168 00:09:39,570 --> 00:09:43,290 mēs varētu būt lasījumā vai rakstot trim baitiem laikā. 169 00:09:43,290 --> 00:09:46,450 Tādā gadījumā, būtu lietderīgi noteikt un pienācīgi nosaukt 170 00:09:46,450 --> 00:09:48,980 struktūrai, kas ir 3 baiti liels. 171 00:09:48,980 --> 00:09:51,410 >> Lai gan strādājot ar failiem var šķist sarežģīta, 172 00:09:51,410 --> 00:09:54,530 izmantojot tos ļauj mums darīt kaut ko patiesi izcils. 173 00:09:54,530 --> 00:09:58,880 Mēs varam mainīt stāvokli pasaulē ārpus mūsu programmu, 174 00:09:58,880 --> 00:10:01,730 mēs varam radīt kaut ko, kas dzīvo ārpus dzīvi mūsu programmas, 175 00:10:01,730 --> 00:10:07,190 vai mēs varam pat mainīt kaut ko, kas tika izveidota pirms mūsu programma sāka darboties. 176 00:10:07,190 --> 00:10:11,210 Saskarsme ar failiem ir patiesi spēcīgs sastāvdaļa plānošanu C. 177 00:10:11,210 --> 00:10:15,300 un es esmu satraukti redzēt, ko jūs gatavojas izveidot ar to kodu, lai nāk. 178 00:10:15,300 --> 00:10:19,770 Mans vārds ir Jason Hirschhorn. Tas ir CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Smiekli] 181 00:10:25,940 --> 00:10:29,330 Labi. Viens ņem. Šeit mēs iet. 182 00:10:49,000 --> 00:10:52,140 Kad mēs domājam par failu - >> Ak, pagaidiet. Žēl. 183 00:10:52,140 --> 00:10:56,800 [Smiekli] Labi. 184 00:11:06,620 --> 00:11:09,970 Hei tur. 185 00:11:13,670 --> 00:11:16,310 Kad mēs domājam par failu - 186 00:11:17,610 --> 00:11:20,710 Kad jūs domājat par failu - Labi. Man pateikt, kad esat gatavs. 187 00:11:20,710 --> 00:11:22,520 Ak, lieliski. 188 00:11:22,520 --> 00:11:26,180 Lai gan lasot no teleprompter var likties - nē. Mans slikti.