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, Universiteti i Harvardit] 3 00:00:04,000 --> 00:00:07,000 [Kjo është CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Kur ne mendojmë për një skedar, ajo që vjen në mendje është një dokument Microsoft Word, 5 00:00:11,000 --> 00:00:14,000 një imazh JPEG, apo një këngë MP3, 6 00:00:14,000 --> 00:00:17,000 dhe ne të ndërveprojnë me secilin nga këto lloje të dosjeve në mënyra të ndryshme. 7 00:00:17,000 --> 00:00:20,000 Për shembull, në një dokument Word që ne të shtoni tekstin 8 00:00:20,000 --> 00:00:24,000 ndërsa me një imazh JPEG ne mund të shfaqem nga skajet ose korrigjoj ngjyrat. 9 00:00:24,000 --> 00:00:28,000 Megjithatë, nën kapuç të gjitha dosjet në kompjuterin tonë janë asgjë më shumë 10 00:00:28,000 --> 00:00:31,000 se një sekuencë të gjatë zero dhe ato. 11 00:00:31,000 --> 00:00:33,000 Kjo është deri në aplikim të veçantë që ndërvepron me dosjen 12 00:00:33,000 --> 00:00:38,000 të vendosin si të procesit këtë sekuencë të gjatë dhe ta paraqesë atë për përdoruesit. 13 00:00:38,000 --> 00:00:41,000 Nga njëra anë, një dokument mund të duket vetëm në një bajt, 14 00:00:41,000 --> 00:00:45,000 ose 8 zero dhe ato, dhe të shfaqin një karakter ASCII në ekran. 15 00:00:45,000 --> 00:00:48,000 Nga ana tjetër, një imazh bitmap mund të shikoni në 3 bytes, 16 00:00:48,000 --> 00:00:50,000 ose 24 zero dhe ato, 17 00:00:50,000 --> 00:00:53,000 dhe interpretuar ato si numra heksadecimal 3 18 00:00:53,000 --> 00:00:56,000 që përfaqësojnë vlerat e kuqe, jeshile, dhe blu 19 00:00:56,000 --> 00:00:58,000 në një piksel të një imazhi. 20 00:00:58,000 --> 00:01:01,000 Çdo gjë që ata mund të duket si në ekranin tuaj, në thelbin e tyre, 21 00:01:01,000 --> 00:01:05,000 fotografi nuk janë asgjë më shumë se një sekuencë të zero dhe ato. 22 00:01:05,000 --> 00:01:08,000 Pra, le të zhytem në dhe të shohim se si ne fakt manipuluar këto zero dhe ato 23 00:01:08,000 --> 00:01:12,000 kur është fjala për të shkruar për të dhe leximi nga një skedar. 24 00:01:12,000 --> 00:01:15,000 >> Unë do të fillojë duke e thyer atë në një proces i thjeshtë 3-pjesë. 25 00:01:15,000 --> 00:01:19,000 Tjetra, unë do të zhyten në dy shembuj kodin që tregojnë këto tri pjesë. 26 00:01:19,000 --> 00:01:23,000 Së fundi, unë do të shqyrtojë procesin dhe disa nga detajet e saj më të rëndësishme. 27 00:01:23,000 --> 00:01:25,000 Ashtu si me çdo skedar që ulet në tavolinën e punës tuaj, 28 00:01:25,000 --> 00:01:28,000 gjëja e parë që bëni është të hapur atë. 29 00:01:28,000 --> 00:01:31,000 Në C bëjmë këtë duke deklaruar një tregues për një struct paracaktuara 30 00:01:31,000 --> 00:01:33,000 që përfaqëson një skedar në disk. 31 00:01:33,000 --> 00:01:38,460 Në këtë thirrje funksion, ne gjithashtu të vendosë nëse ne duam të shkruani apo lexuar nga dosja. 32 00:01:38,460 --> 00:01:41,660 Tjetra, ne bëjmë leximin aktuale dhe shkrim. 33 00:01:41,660 --> 00:01:44,800 Ka një numër të funksioneve të specializuara, ne mund të përdorim në këtë pjesë, 34 00:01:44,800 --> 00:01:48,790 dhe pothuajse të gjithë ata fillojnë me shkronjën F, i cili qëndron për file. 35 00:01:48,790 --> 00:01:53,560 Fundit, e ngjashme me pak X kuqe në qoshe të lartë të dosjeve të hapur në kompjuterin tuaj, 36 00:01:53,560 --> 00:01:56,680 e mbyllim skedë me një thirrje funksion përfundimtar. 37 00:01:56,680 --> 00:01:59,540 Tani që ne kemi një ide të përgjithshme të asaj që ne jemi duke shkuar për të bërë, 38 00:01:59,540 --> 00:02:02,000 le pikiatë në kodin. 39 00:02:02,000 --> 00:02:06,100 >> Në këtë directory, ne kemi dy fotografi dhe dosjet përkatëse C e tyre ekzekutueshme. 40 00:02:06,100 --> 00:02:09,710 Programi makinë shkrimi merr një linjë argumenti komandës, 41 00:02:09,710 --> 00:02:12,060 Emri i dokumentit ne duam të krijuar. 42 00:02:12,060 --> 00:02:16,160 Në këtë rast, ne do të thërrasë atë doc.txt. 43 00:02:16,160 --> 00:02:19,080 Le të drejtuar programin dhe të hyjë në një çift të linjave. 44 00:02:19,080 --> 00:02:23,660 Hi. Emri im është Jason. 45 00:02:23,660 --> 00:02:26,710 Së fundi, ne do të shkruani "lë". 46 00:02:26,710 --> 00:02:29,720 Nëse ne tani lista të gjitha dosjet në këtë directory, 47 00:02:29,720 --> 00:02:33,770 ne shohim se ekziston një dokument të ri të quajtur doc.txt. 48 00:02:34,190 --> 00:02:36,110 Kjo është dosja e këtij programi krijuar vetëm. 49 00:02:36,110 --> 00:02:40,520 Dhe sigurisht, edhe ajo është asgjë më shumë se një sekuencë të gjatë zero dhe ato. 50 00:02:41,100 --> 00:02:43,260 Nëse ne të hapur këtë skedë të re, 51 00:02:43,260 --> 00:02:45,870 ne shohim 3 rreshta të kodit Ne kemi hyrë në programin tonë - 52 00:02:46,060 --> 00:02:49,060 Hi. Emri maj është Jason. 53 00:02:49,580 --> 00:02:52,090 Por çfarë është në të vërtetë ndodh kur typewriter.c shkon? 54 00:02:52,810 --> 00:02:55,520 Linja e parë e interesit për ne është linjë 24. 55 00:02:55,560 --> 00:02:58,490 Në këtë linjë, ne deklarojnë treguesin tonë file. 56 00:02:59,080 --> 00:03:03,140 Funksioni që kthen këtë tregues, fopen, merr dy argumente. 57 00:03:03,140 --> 00:03:07,440 Parë është emri i file duke përfshirë file extension nëse është e përshtatshme. 58 00:03:07,440 --> 00:03:10,980 Kujtojnë se një file extension nuk ndikojnë dosjen në nivelin e tij të ulët. 59 00:03:10,980 --> 00:03:14,640 Ne jemi gjithmonë të bëjmë me një rend të gjatë zero dhe ato. 60 00:03:14,640 --> 00:03:19,630 Por ajo ka ndikim sa fotografi janë interpretuar dhe se çfarë aplikacionet janë përdorur për të hapur ato. 61 00:03:19,630 --> 00:03:22,290 Argumenti i dytë për fopen është një letër të vetme 62 00:03:22,290 --> 00:03:25,300 që qëndron për atë që kemi në plan të bëjmë pasi kemi hapur dosjen. 63 00:03:25,300 --> 00:03:30,630 Ekzistojnë tri opsione për këtë argument - W, R, dhe A. 64 00:03:30,630 --> 00:03:34,900 Ne kemi zgjedhur w në këtë rast, sepse ne duam për të shkruar për të file. 65 00:03:34,900 --> 00:03:38,820 R, si ju mund ndoshta me mend, është për të lexuar në dosjen. 66 00:03:38,820 --> 00:03:41,760 Dhe një është për appending tek dosjen. 67 00:03:41,760 --> 00:03:44,960 Ndërsa dy w dhe mund të përdoret për të shkruar për fotografi, 68 00:03:44,960 --> 00:03:47,460 w do të fillojë me shkrim nga fillimi e dosjes 69 00:03:47,460 --> 00:03:50,810 dhe potencialisht prishësh ndonjë të dhëna që kanë qenë më parë të ruajtura. 70 00:03:50,810 --> 00:03:54,070 By default, madhësia e kemi hapur, në qoftë se ajo nuk ekziston, 71 00:03:54,070 --> 00:03:57,180 është krijuar në directory tonë të punës aktuale. 72 00:03:57,180 --> 00:04:00,540 Megjithatë, në qoftë se ne duam të hyni ose të krijojë një skedar në një lokacion tjetër, 73 00:04:00,540 --> 00:04:02,650 në të argumentit parë të fopen, 74 00:04:02,650 --> 00:04:05,840 ne mund të specifikoni nje rruge e fotografisë përveç emrit të file. 75 00:04:05,840 --> 00:04:09,490 Ndërsa pjesa e parë e këtij procesi është vetëm një linjë e kodit të gjatë, 76 00:04:09,490 --> 00:04:12,350 është gjithmonë një praktikë e mirë për të përfshirë një grup të linjave 77 00:04:12,350 --> 00:04:15,930 që të shikoni për të siguruar që dosja u hap me sukses ose të krijuar. 78 00:04:15,930 --> 00:04:20,300 Nëse fopen kthen null, ne nuk do të duan për të ecur përpara me programin tonë, 79 00:04:20,300 --> 00:04:23,270 dhe kjo mund të ndodhë në qoftë se sistemi operativ është jashtë kujtesës 80 00:04:23,270 --> 00:04:27,940 ose në qoftë se ne të përpiqemi për të hapur një skedë në një directory, për të cilat ne nuk e kanë lejet e duhura. 81 00:04:27,940 --> 00:04:31,780 >> Pjesa e dytë e procesit të zhvillohet në lak makinë shkrimi, ndërsa. 82 00:04:31,780 --> 00:04:35,000 Ne përdorim një funksion CS50 bibliotekë për të marrë të dhëna nga përdoruesit, 83 00:04:35,000 --> 00:04:37,190 dhe duke supozuar se ata nuk duan të lënë programin, 84 00:04:37,190 --> 00:04:41,940 ne përdorim fputs funksion për të marrë string dhe shkruani atë në dosjen. 85 00:04:41,940 --> 00:04:46,700 fputs është vetëm një nga shumë funksione ne mund të përdorim për të shkruar për të file. 86 00:04:46,700 --> 00:04:51,920 Të tjerat përfshijnë fwrite, fputc, dhe madje edhe fprintf. 87 00:04:51,920 --> 00:04:54,840 Pavarësisht nga funksioni të caktuar deri ne fund duke përdorur, edhe pse, 88 00:04:54,840 --> 00:04:57,480 të gjithë ata duhet të dinë se, me anë të argumenteve të tyre, 89 00:04:57,480 --> 00:04:59,670 të paktën dy gjëra - 90 00:04:59,670 --> 00:05:03,140 çfarë duhet të jetë e shkruar dhe ku ajo duhet të jetë e shkruar për të. 91 00:05:03,140 --> 00:05:07,240 Në rastin tonë, input është varg që duhet të jetë e shkruar 92 00:05:07,240 --> 00:05:11,290 dhe FP është tregues që na drejton aty ku ne jemi me shkrim. 93 00:05:11,290 --> 00:05:15,330 Në këtë program, pjesë dy e procesit është mjaft i thjeshtë. 94 00:05:15,330 --> 00:05:17,360 Ne jemi thjesht duke marrë një varg nga përdoruesit 95 00:05:17,360 --> 00:05:22,120 dhe duke shtuar atë direkt në dosjen tonë me pak-me-asnjë input validation ose kontrolle të sigurisë. 96 00:05:22,120 --> 00:05:26,160 Shpesh, megjithatë, pjesa e dytë do të marrë pjesën më të madhe të kodit tuaj. 97 00:05:26,160 --> 00:05:30,580 Së fundi, një pjesë tre është në linjë 58, ku ne të mbyllë dosjen. 98 00:05:30,580 --> 00:05:34,860 Këtu ne e quajmë Shkrimi dhe të kalojë atë origjinal treguesin tonë file. 99 00:05:34,860 --> 00:05:39,500 Në linjë pasuese, do të kthehemi zero, duke sinjalizuar fundin e programit tonë. 100 00:05:39,500 --> 00:05:42,630 Dhe, po, pjesë tre është aq e thjeshtë sa se. 101 00:05:42,630 --> 00:05:45,260 >> Le të lëvizin për të lexuar nga fotografi. 102 00:05:45,260 --> 00:05:48,220 Kthehu në directory tonë ne kemi një skedar të quajtur printer.c. 103 00:05:48,220 --> 00:05:50,910 Le të drejtuar atë me dosjen ne vetëm krijuar - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Ky program, siç sugjeron emri, thjesht do të shtypura nga përmbajtjet e dosjes së kaluar për të. 106 00:05:58,150 --> 00:06:00,230 Dhe nuk kemi atë. 107 00:06:00,230 --> 00:06:03,780 Linjat e kodit kishim shtypur më herët dhe do të ruhen në doc.txt. 108 00:06:03,780 --> 00:06:06,980 Hi. Emri im është Jason. 109 00:06:06,980 --> 00:06:09,120 Nëse ne pikiatë në printer.c, 110 00:06:09,120 --> 00:06:13,570 ne shohim se një shumë e kodit duket e ngjashme me atë që ne vetëm të ecur përmes në typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Në të vërtetë Shkarko 22, ku kemi hapur dosjen, 112 00:06:16,720 --> 00:06:19,220 dhe linjës 39, ku kemi mbyllur dosjen, 113 00:06:19,220 --> 00:06:23,890 të dyja janë pothuajse identike me typewriter.c, përveç argumentit fopen dytë. 114 00:06:23,890 --> 00:06:26,510 Këtë herë ne jemi duke lexuar nga një skedar, 115 00:06:26,510 --> 00:06:29,040 kështu që ne kemi zgjedhur në vend të r w. 116 00:06:29,040 --> 00:06:31,950 Kështu, le të përqëndrohet në pjesën e dytë të procesit. 117 00:06:31,950 --> 00:06:36,060 Në linjë 35, si kusht dytë në 4 lak tonë, 118 00:06:36,060 --> 00:06:38,590 kemi bërë një thirrje për fgets, 119 00:06:38,590 --> 00:06:42,190 funksion shoqërues fputs nga më parë. 120 00:06:42,190 --> 00:06:44,660 Këtë herë ne kemi tre argumente. 121 00:06:44,660 --> 00:06:48,810 E para është tregues për grup të karaktereve, ku vargu do të ruhen. 122 00:06:48,810 --> 00:06:52,670 E dyta është numri maksimal i karaktereve për t'u lexuar. 123 00:06:52,670 --> 00:06:56,010 Dhe e treta është tregues për dosjen me të cilën ne jemi duke punuar. 124 00:06:56,010 --> 00:07:00,780 Ju do të vëreni se për lak mbaron kur fgets kthehet null. 125 00:07:00,780 --> 00:07:02,940 Ka dy arsye që kjo mund të ketë ndodhur. 126 00:07:02,940 --> 00:07:05,380 Së pari, një gabim mund të ketë ndodhur. 127 00:07:05,380 --> 00:07:10,740 Së dyti, dhe më shumë gjasa, në fund të dosjes u arrit dhe jo më shumë karaktere janë lexuar. 128 00:07:10,740 --> 00:07:14,040 Në rast se ju jeni pyesin, dy funksione nuk ekzistojnë që të na lejojë të them 129 00:07:14,040 --> 00:07:17,160 Arsyeja e cila është shkaku për këtë tregues null veçantë. 130 00:07:17,160 --> 00:07:21,090 Dhe, nuk është çudi, pasi ata kanë të bëjnë me të punuar me fotografi, 131 00:07:21,090 --> 00:07:26,940 dy funksioni ferror dhe fillimi funksioni feof me f letër. 132 00:07:26,940 --> 00:07:32,130 >> Së fundi, para se të arrijmë në përfundimin, një shënim të shpejtë për në fund të funksionit fotografi, 133 00:07:32,130 --> 00:07:36,690 e cila, siç u përmend vetëm, është shkruar si feof. 134 00:07:36,690 --> 00:07:41,550 Shpesh ju do të gjeni veten duke përdorur për sythe, ndërsa dhe progresive të lexuar në rrugën tuaj nëpërmjet dosjeve. 135 00:07:41,550 --> 00:07:45,790 Kështu, ju do të duhet një mënyrë për t'i dhënë fund këto sythe pasi të keni arritur në fund të këtyre dosjeve. 136 00:07:45,790 --> 00:07:50,510 Thirrja e feof në treguesin tuaj file dhe kontrolluar për të parë nëse ajo është e vërtetë 137 00:07:50,510 --> 00:07:52,310 do të bëjë vetëm se. 138 00:07:52,310 --> 00:07:59,820 Kështu, një lak, ndërsa me kusht (! Feof (FP)) mund të duket si një zgjidhje të përkryer të përshtatshme. 139 00:07:59,820 --> 00:08:03,770 Megjithatë, thonë se ne kemi një linjë të mbetur në skedar teksti tonë. 140 00:08:03,770 --> 00:08:07,130 Ne do të hyjë në lak tonë, ndërsa dhe çdo gjë do të punojnë jashtë siç është planifikuar. 141 00:08:07,130 --> 00:08:12,750 Në raundin e ardhshëm përmes, programi ynë do të kontrollojë për të parë nëse feof e PF është e vërtetë, 142 00:08:12,750 --> 00:08:15,430 por - dhe kjo është pika vendimtare për të kuptuar këtu - 143 00:08:15,430 --> 00:08:17,770 ajo nuk do të jetë e vërtetë vetëm ende. 144 00:08:17,770 --> 00:08:21,110 Kjo është për shkak se qëllimi i feof nuk është për të kontrolluar 145 00:08:21,110 --> 00:08:24,400 nëse thirrja e ardhshme për një funksion të lexuar do të goditur në fund të dosjes, 146 00:08:24,400 --> 00:08:28,190 por më tepër për të kontrolluar nëse janë apo jo në fund të dosjes tashmë është arritur. 147 00:08:28,190 --> 00:08:30,140 Në rastin e këtij shembull, 148 00:08:30,140 --> 00:08:32,780 lexuar vijën e fundit të dosjes tonë shkon të përkryer mirë, 149 00:08:32,780 --> 00:08:36,210 por programi ende nuk e di se ne kemi goditur në fund të dosjes tonë. 150 00:08:36,210 --> 00:08:40,549 Kjo nuk është deri sa ajo ka një lexuar shtesë që ajo kundërvihet në fund të file. 151 00:08:40,549 --> 00:08:43,210 Kështu, një kusht i saktë do të jetë si në vijim: 152 00:08:43,210 --> 00:08:49,330 fgets dhe argumentet e saj tre - Prodhimi, madhësia e prodhimit, dhe FP - 153 00:08:49,330 --> 00:08:52,570 dhe të gjithë që të mos e barabartë me null. 154 00:08:52,570 --> 00:08:55,260 Kjo është qasja që ne e mori në printer.c, 155 00:08:55,260 --> 00:08:57,890 dhe në këtë rast, pas daljet lak, 156 00:08:57,890 --> 00:09:04,290 ju mund të telefononi ose feof ferror për të informuar përdoruesit për sa i përket arsyetimit të veçantë për këtë lak daljes. 157 00:09:04,290 --> 00:09:08,100 >> Shkrim dhe lexim nga një skedar është, në bazë shumicën e saj, 158 00:09:08,100 --> 00:09:10,150 një thjeshtë 3-pjesa proces. 159 00:09:10,150 --> 00:09:12,530 Së pari, ne kemi hapur dosjen. 160 00:09:12,530 --> 00:09:16,740 Së dyti, ne kemi vënë disa gjëra në dosjen tonë, ose të marrë disa gjëra nga ajo. 161 00:09:16,740 --> 00:09:19,200 Së treti, ne mbyllë dosjen. 162 00:09:19,200 --> 00:09:21,170 Pjesët e para dhe e fundit janë të lehta. 163 00:09:21,170 --> 00:09:23,920 Pjesa e mesme është ajo ku stuff ndërlikuar gënjeshtra. 164 00:09:23,920 --> 00:09:27,760 Dhe pse nën kapuç ne jemi gjithmonë të bëjmë me një rend të gjatë zero dhe ato, 165 00:09:27,760 --> 00:09:30,710 ajo ka ndihmuar kur coding për të shtuar një shtresë e abstraksionit 166 00:09:30,710 --> 00:09:35,350 që e kthen rend në diçka që ngjan më afër asaj që ne jemi duke përdorur për të shohim. 167 00:09:35,350 --> 00:09:39,570 Për shembull, në qoftë se ne jemi duke punuar me një dosje të 24-bit bitmap, 168 00:09:39,570 --> 00:09:43,290 ne do të ngjarë të jetë e lexuar ose shkruar tre bytes në një kohë. 169 00:09:43,290 --> 00:09:46,450 Në të cilin rast, ajo do të kishte kuptim për të përcaktuar dhe të përshtatshme emrit 170 00:09:46,450 --> 00:09:48,980 një struct që është 3 bytes madh. 171 00:09:48,980 --> 00:09:51,410 >> Edhe pse duke punuar me fotografi mund të duket e komplikuar, 172 00:09:51,410 --> 00:09:54,530 shfrytëzuar ato na lejon për të bërë diçka të vërtetë të shquar. 173 00:09:54,530 --> 00:09:58,880 Ne mund të ndryshojë gjendjen e botës jashtë programit tonë, 174 00:09:58,880 --> 00:10:01,730 ne mund të krijojë diçka që jeton përtej jetës së programit tonë, 175 00:10:01,730 --> 00:10:07,190 ose ne mund edhe të ndryshojë diçka që është krijuar para se programi ynë ka filluar running. 176 00:10:07,190 --> 00:10:11,210 Bashkëveprojmë me fotografi është një pjesë të vërtetë të fuqishme të programimit në C. 177 00:10:11,210 --> 00:10:15,300 dhe unë jam i ngazëllyer për të parë se çfarë ju jeni duke shkuar për të krijuar me të në kodin për të ardhur. 178 00:10:15,300 --> 00:10:19,770 Emri im është Jason Hirschhorn. Kjo është CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Qeshura] 181 00:10:25,940 --> 00:10:29,330 Rregull. Një marrë. Këtu ne do të shkojmë. 182 00:10:49,000 --> 00:10:52,140 Kur ne mendojmë për një skedar - >> Oh, prisni. Më vjen keq. 183 00:10:52,140 --> 00:10:56,800 [Qeshura] Okay. 184 00:11:06,620 --> 00:11:09,970 Hey atje. 185 00:11:13,670 --> 00:11:16,310 Kur ne mendojmë për një skedar - 186 00:11:17,610 --> 00:11:20,710 Kur ju mendoni për një skedar - Mirë. Thoni kur ju jeni gati. 187 00:11:20,710 --> 00:11:22,520 Oh, e madhe. 188 00:11:22,520 --> 00:11:26,180 Megjithëse leximi nga një teleprompter mund të duket - nr. My bad.