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, Harvard University] 3 00:00:04,000 --> 00:00:07,000 [Ito ay CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Kapag sa tingin namin ng isang file, ano pagdating sa isipan ng isang dokumento sa Microsoft Word, 5 00:00:11,000 --> 00:00:14,000 JPEG imahe, o isang MP3 kanta, 6 00:00:14,000 --> 00:00:17,000 at nakikipag-ugnayan kami sa bawat isa sa mga ganitong uri ng mga file sa iba't ibang paraan. 7 00:00:17,000 --> 00:00:20,000 Halimbawa, sa isang dokumento ng Word idagdag namin ang teksto 8 00:00:20,000 --> 00:00:24,000 habang may isang JPEG imahe maaari naming i-crop ang mga gilid o retouch ang mga kulay. 9 00:00:24,000 --> 00:00:28,000 Pa sa ilalim ng hood ang lahat ng mga file sa aming mga computer ay walang mas 10 00:00:28,000 --> 00:00:31,000 kaysa sa isang mahabang pagkakasunud-sunod ng mga zero at mga. 11 00:00:31,000 --> 00:00:33,000 Ito hanggang sa mismong application na nakikipag-ugnayan sa mga file 12 00:00:33,000 --> 00:00:38,000 upang magpasya kung paano i-proseso ang mahabang sequence at ipakita ito sa user. 13 00:00:38,000 --> 00:00:41,000 Sa isang dako, ang dokumento ay maaaring tumingin sa isang byte lang, 14 00:00:41,000 --> 00:00:45,000 o 8 zero at na, at ipakita ang isang ASCII na character sa screen. 15 00:00:45,000 --> 00:00:48,000 Sa kabilang banda, bitmap imahe ay maaaring tumingin sa 3 bytes, 16 00:00:48,000 --> 00:00:50,000 o 24 zero at na, 17 00:00:50,000 --> 00:00:53,000 at bigyang-kahulugan ang mga ito bilang 3 hexadecimal numero 18 00:00:53,000 --> 00:00:56,000 na kumakatawan sa mga halaga para sa pula, berde, at asul 19 00:00:56,000 --> 00:00:58,000 sa isang pixel ng isang imahe. 20 00:00:58,000 --> 00:01:01,000 Anuman ang maaari nilang hitsura sa iyong screen, sa kanilang mga core, 21 00:01:01,000 --> 00:01:05,000 file ay walang higit pa kaysa sa isang pagkakasunud-sunod ng mga zero at mga. 22 00:01:05,000 --> 00:01:08,000 Kaya natin sumisid sa at tumingin sa kung paano namin ang aktwal na manipulahin ang mga zero at mga 23 00:01:08,000 --> 00:01:12,000 pagdating sa pagsulat sa at pagbabasa mula sa isang file. 24 00:01:12,000 --> 00:01:15,000 >> Kukunin ko na magsimula sa pamamagitan ng paglabag ito sa isang simpleng proseso ng 3-bahagi. 25 00:01:15,000 --> 00:01:19,000 Susunod, kailangan ko sumisid sa dalawang mga halimbawa ng code na nagpapakita ng mga tatlong bahagi. 26 00:01:19,000 --> 00:01:23,000 Panghuli, kukunin ko na suriin ang proseso at ang ilan ng mga pinaka-mahalagang mga detalye. 27 00:01:23,000 --> 00:01:25,000 Tulad ng sa anumang file na makikita sa iyong desktop, 28 00:01:25,000 --> 00:01:28,000 ang unang bagay na gawin ay upang buksan ito. 29 00:01:28,000 --> 00:01:31,000 Sa C gawin namin ito sa pamamagitan ng deklarasyon ng pointer sa isang paunang-natukoy na struct 30 00:01:31,000 --> 00:01:33,000 na kumakatawan sa isang file sa disk. 31 00:01:33,000 --> 00:01:38,460 Sa function na tawag na ito, kami din magpasya kung nais namin na magsulat o magbasa mula sa file. 32 00:01:38,460 --> 00:01:41,660 Susunod, gawin namin ang aktwal na pagbabasa at pagsusulat. 33 00:01:41,660 --> 00:01:44,800 Mayroong isang bilang ng mga pinasadyang mga function na maaari naming gamitin sa bahaging ito, 34 00:01:44,800 --> 00:01:48,790 at halos lahat sa kanila ay nagsisimula sa titik F, na nakatayo para sa file. 35 00:01:48,790 --> 00:01:53,560 Huling, kamag-anak sa maliit na pulang X sa tuktok na sulok ng mga file buksan sa iyong computer, 36 00:01:53,560 --> 00:01:56,680 namin na isara ang file na may huling function na tawag. 37 00:01:56,680 --> 00:01:59,540 Ngayon na kami ay may isang pangkalahatang ideya ng kung ano ang kami ay pagpunta sa gawin, 38 00:01:59,540 --> 00:02:02,000 sabihin dive sa code. 39 00:02:02,000 --> 00:02:06,100 >> Sa direktoryong ito, mayroon kaming dalawang mga file C at ang kanilang mga kaukulang executable file. 40 00:02:06,100 --> 00:02:09,710 Ang makinilya na programa ay tumatagal ng isang argumento command line, 41 00:02:09,710 --> 00:02:12,060 ang pangalan ng dokumento na gusto naming upang lumikha ng. 42 00:02:12,060 --> 00:02:16,160 Sa kasong ito, makikita namin tumawag itong doc.txt. 43 00:02:16,160 --> 00:02:19,080 Natin patakbuhin ang program at magpasok ng ilang mga linya. 44 00:02:19,080 --> 00:02:23,660 Hi. Ang pangalan ko ay Jason. 45 00:02:23,660 --> 00:02:26,710 Panghuli, makikita namin type "mag-quit." 46 00:02:26,710 --> 00:02:29,720 Kung ngayon namin ilista ang lahat ng mga file sa direktoryong ito, 47 00:02:29,720 --> 00:02:33,770 nakikita namin na ang isang bagong dokumento umiiral tinatawag doc.txt. 48 00:02:34,190 --> 00:02:36,110 Iyon ay ang file sa programang ito na nilikha. 49 00:02:36,110 --> 00:02:40,520 At siyempre, masyadong ito ay walang higit pa kaysa sa isang mahabang pagkakasunud-sunod ng mga zero at mga. 50 00:02:41,100 --> 00:02:43,260 Kung buksan namin ang bagong file na ito, 51 00:02:43,260 --> 00:02:45,870 nakita namin ang 3 linya ng code na ipinasok namin sa aming programa - 52 00:02:46,060 --> 00:02:49,060 Hi. Mayo pangalan ay Jason. 53 00:02:49,580 --> 00:02:52,090 Ngunit kung ano ang aktwal na pagpunta sa kapag typewriter.c tumatakbo? 54 00:02:52,810 --> 00:02:55,520 Ang unang linya ng interes para sa atin linya 24. 55 00:02:55,560 --> 00:02:58,490 Sa linya na ito, ipinapahayag namin ang aming file pointer. 56 00:02:59,080 --> 00:03:03,140 Ang function na ay nagbabalik ito pointer, fopen, ay tumatagal ng dalawang argumento. 57 00:03:03,140 --> 00:03:07,440 Ang una ay ang pangalan ng file kabilang ang file extension kung naaangkop. 58 00:03:07,440 --> 00:03:10,980 Manariwa sa diwa na ang file extension ay hindi nakakaimpluwensya ang file sa nito pinakamababang antas. 59 00:03:10,980 --> 00:03:14,640 Palagi kaming pagharap sa isang mahabang pagkakasunud-sunod ng mga zero at mga. 60 00:03:14,640 --> 00:03:19,630 Ngunit ito gumagana ang impluwensiya kung paano ang mga file ay kahulugan at kung ano ang application ay ginagamit upang buksan ang mga ito. 61 00:03:19,630 --> 00:03:22,290 Ang pangalawang argumento sa fopen ng isang sulat 62 00:03:22,290 --> 00:03:25,300 na nakatayo para sa kung ano ang balak naming gawin pagkatapos buksan namin ang file. 63 00:03:25,300 --> 00:03:30,630 May tatlong mga pagpipilian para sa argumento - W, R, at A. 64 00:03:30,630 --> 00:03:34,900 Pinili namin ang w sa kasong ito dahil gusto namin na magsulat sa ang file. 65 00:03:34,900 --> 00:03:38,820 R, tulad ng maaari mong marahil hulaan, ay para sa pagbabasa sa file. 66 00:03:38,820 --> 00:03:41,760 At para sa appending sa file. 67 00:03:41,760 --> 00:03:44,960 Habang parehong w at maaaring ginagamit para sa pagsusulat sa mga file, 68 00:03:44,960 --> 00:03:47,460 w ay simulan ang pagsusulat mula sa simula ng file 69 00:03:47,460 --> 00:03:50,810 at potensyal na mapapatungan ang anumang data na dati ay naka-imbak. 70 00:03:50,810 --> 00:03:54,070 Sa pamamagitan ng default, ang file namin buksan, kung hindi ito ay umiiral na, 71 00:03:54,070 --> 00:03:57,180 nilikha sa aming kasalukuyang nagtatrabaho direktoryo. 72 00:03:57,180 --> 00:04:00,540 Gayunpaman, kung gusto naming i-access o lumikha ng isang file sa ibang lokasyon, 73 00:04:00,540 --> 00:04:02,650 sa unang argumento ng fopen, 74 00:04:02,650 --> 00:04:05,840 maaari naming tukuyin ang isang path ng file sa karagdagan sa mga pangalan ng file. 75 00:04:05,840 --> 00:04:09,490 Habang ang mga unang bahagi ng prosesong ito ay lamang ng isang linya ng code katagal, 76 00:04:09,490 --> 00:04:12,350 ito ay palaging mahusay na kasanayan upang isama ng isa pang hanay ng mga linya 77 00:04:12,350 --> 00:04:15,930 na suriin upang matiyak na ang file ay matagumpay na binuksan o nilikha. 78 00:04:15,930 --> 00:04:20,300 Kung fopen nagbabalik null, hindi namin nais na sumulong sa aming programa, 79 00:04:20,300 --> 00:04:23,270 at ito ay maaaring mangyari kung ang operating system ng memory 80 00:04:23,270 --> 00:04:27,940 o kung sinusubukan naming buksan ang isang file sa isang direktoryo na kung saan hindi namin magkaroon ng tamang pahintulot. 81 00:04:27,940 --> 00:04:31,780 >> Bahagi dalawang ng proseso ay tumatagal ng lugar sa habang loop makinilya. 82 00:04:31,780 --> 00:04:35,000 Gumagamit kami ng CS50 function na library upang makakuha ng input mula sa user, 83 00:04:35,000 --> 00:04:37,190 at ipagpalagay na hindi nila nais na umalis sa programa, 84 00:04:37,190 --> 00:04:41,940 ginagamit namin ang fputs function na upang gawin ang string at isulat ang mga ito sa ang file. 85 00:04:41,940 --> 00:04:46,700 fputs ay isa lamang ng maraming mga function na maaari naming gamitin upang sumulat sa file. 86 00:04:46,700 --> 00:04:51,920 Iba ang fwrite, fputc, at kahit fprintf. 87 00:04:51,920 --> 00:04:54,840 Anuman ng partikular na function na naming magtapos up gamit, bagaman, 88 00:04:54,840 --> 00:04:57,480 lahat ng mga ito ay kailangang malaman, sa pamamagitan ng kanilang mga argumento, 89 00:04:57,480 --> 00:04:59,670 hindi bababa sa dalawang bagay - 90 00:04:59,670 --> 00:05:03,140 kung ano ang kailangang nakasulat at kung saan ito kailangang nakasulat sa. 91 00:05:03,140 --> 00:05:07,240 Sa aming kaso, input ay ang string na kailangang nakasulat 92 00:05:07,240 --> 00:05:11,290 at fp ang pointer na dumidirekta sa amin sa kung saan kami ay sumusulat. 93 00:05:11,290 --> 00:05:15,330 Sa programang ito, bahagi dalawang ng proseso sa halip direkta. 94 00:05:15,330 --> 00:05:17,360 Lamang namin ang paglalaan ng isang string mula sa gumagamit 95 00:05:17,360 --> 00:05:22,120 at pagdagdag nito nang direkta sa aming mga file na may kaunti sa walang pagpapatunay ng input o mga pagsusuri ng seguridad. 96 00:05:22,120 --> 00:05:26,160 Madalas, gayunpaman, bahagi dalawang tumagal ng hanggang ang bulk ng iyong code. 97 00:05:26,160 --> 00:05:30,580 Panghuli, bahagi tatlong sa linya 58, kung saan naming isara ang file. 98 00:05:30,580 --> 00:05:34,860 Narito tawagan namin fclose at pumasa ito ang aming orihinal na file pointer. 99 00:05:34,860 --> 00:05:39,500 Sa kasunod na linya, bumalik kami zero, pagbibigay ng senyas sa dulo ng aming programa. 100 00:05:39,500 --> 00:05:42,630 At, oo, bahagi tatlong ay bilang simpleng bilang na. 101 00:05:42,630 --> 00:05:45,260 >> Ilipat natin sa pagbabasa mula sa mga file. 102 00:05:45,260 --> 00:05:48,220 Bumalik sa aming direktoryo na mayroon kami ng isang file na tinatawag na printer.c. 103 00:05:48,220 --> 00:05:50,910 Natin patakbuhin ito sa mga file na nilikha lang namin - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Ang program na ito, pati na ang pangalan ay nagmumungkahi, ay i-print ang mga nilalaman ng file ang pumasa dito. 106 00:05:58,150 --> 00:06:00,230 At doon ay may namin ito. 107 00:06:00,230 --> 00:06:03,780 Ang mga linya ng code namin ay nai-type nang mas maaga at save sa doc.txt. 108 00:06:03,780 --> 00:06:06,980 Hi. Ang pangalan ko ay Jason. 109 00:06:06,980 --> 00:06:09,120 Kung dive namin sa printer.c, 110 00:06:09,120 --> 00:06:13,570 nakikita namin na ang isang maraming ng code ay mukhang katulad sa kung ano ang aming lamang lumakad sa pamamagitan ng sa typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Katunayan linya 22, kung saan binuksan namin ang file, 112 00:06:16,720 --> 00:06:19,220 at linya 39, kung saan namin sarado ang file, 113 00:06:19,220 --> 00:06:23,890 Parehong halos kapareho ng typewriter.c, i-save para sa fopen pangalawang argumento. 114 00:06:23,890 --> 00:06:26,510 Oras na ito namin ang pagbabasa mula sa isang file, 115 00:06:26,510 --> 00:06:29,040 kaya namin pinili ang r sa halip ng w. 116 00:06:29,040 --> 00:06:31,950 Kaya, sabihin tumuon sa ikalawang bahagi ng proseso. 117 00:06:31,950 --> 00:06:36,060 Sa ika-35 linya, bilang pangalawang kundisyon sa aming 4 loop, 118 00:06:36,060 --> 00:06:38,590 gumawa kami ng isang tawag sa mga fgets, 119 00:06:38,590 --> 00:06:42,190 ang kasamang function na sa fputs mula sa bago. 120 00:06:42,190 --> 00:06:44,660 Oras na ito na mayroon kaming tatlong argumento. 121 00:06:44,660 --> 00:06:48,810 Ang una ay ang pointer sa hanay ng mga character na kung saan ay naka-imbak ang string. 122 00:06:48,810 --> 00:06:52,670 Ang pangalawa ay ang maximum na bilang ng mga character na mabasa. 123 00:06:52,670 --> 00:06:56,010 At third ang pointer sa file na nagsusumikap kami. 124 00:06:56,010 --> 00:07:00,780 Mapapansin mo na ang para sa loop ay nagtatapos kapag fgets nagbabalik null. 125 00:07:00,780 --> 00:07:02,940 Mayroong dalawang dahilan na ito ay maaaring nangyari. 126 00:07:02,940 --> 00:07:05,380 Una, ang isang error ay maaaring naganap. 127 00:07:05,380 --> 00:07:10,740 Pangalawa, at mas malamang, ang dulo ng file ay naabot at walang higit pang mga character ay basahin. 128 00:07:10,740 --> 00:07:14,040 Sa kaso ikaw ay nagtataka, dalawang function umiiral na nagbibigay-daan sa amin upang sabihin sa 129 00:07:14,040 --> 00:07:17,160 kung aling dahilan ay ang dahilan para sa partikular na null pointer. 130 00:07:17,160 --> 00:07:21,090 At, hindi nakakagulat, dahil mayroon silang gawin sa pakikipagtulungan sa mga file, 131 00:07:21,090 --> 00:07:26,940 parehong ferror function na at ang function na pagsisimula ng feof na may sulat sa f. 132 00:07:26,940 --> 00:07:32,130 >> Panghuli, bago pagtibayin namin, isang maikling paalala tungkol sa dulo ng file function na, 133 00:07:32,130 --> 00:07:36,690 kung saan, bilang lang nabanggit, ay nakasulat bilang feof. 134 00:07:36,690 --> 00:07:41,550 Madalas makikita mo ang iyong sarili gamit habang at para sa mga loop sa progressively basahin ang iyong paraan sa pamamagitan ng mga file. 135 00:07:41,550 --> 00:07:45,790 Kaya, kakailanganin mo ng isang paraan upang tapusin ang mga loop pagkatapos mong maabot ang dulo ng mga file na ito. 136 00:07:45,790 --> 00:07:50,510 Pagtawag feof sa iyong file pointer at check upang makita kung ito ay totoo 137 00:07:50,510 --> 00:07:52,310 ay gawin lamang na. 138 00:07:52,310 --> 00:07:59,820 Kaya, ang isang habang loop may kundisyon (! Feof (fp)) ay maaaring mukhang tulad ng isang perpektong naaangkop na solusyon. 139 00:07:59,820 --> 00:08:03,770 Gayunpaman, sabihin nating mayroon kaming isang linya na naiwan sa aming text file. 140 00:08:03,770 --> 00:08:07,130 Susubukan naming ipasok ang aming habang loop at ang lahat ay gagana bilang binalak. 141 00:08:07,130 --> 00:08:12,750 Sa susunod na round sa pamamagitan ng, ang aming programa ay suriin upang makita kung feof ng fp totoo, 142 00:08:12,750 --> 00:08:15,430 ngunit - at ito ay ang mahalagang punto upang maunawaan dito - 143 00:08:15,430 --> 00:08:17,770 hindi ito magiging totoo pa. 144 00:08:17,770 --> 00:08:21,110 Iyon ay dahil ang layunin ng feof ay hindi upang suriin 145 00:08:21,110 --> 00:08:24,400 kung ang susunod na tawag sa isang basahin ang function ay pindutin ang dulo ng file, 146 00:08:24,400 --> 00:08:28,190 kundi upang suriin kung o hindi na naabot ang dulo ng file. 147 00:08:28,190 --> 00:08:30,140 Sa kaso ng mga halimbawang ito, 148 00:08:30,140 --> 00:08:32,780 pagbabasa sa huling linya ng aming mga file napupunta perpektong maayos, 149 00:08:32,780 --> 00:08:36,210 ngunit ang programa ay hindi pa alam na namin pindutin ang dulo ng aming mga file. 150 00:08:36,210 --> 00:08:40,549 Hindi ito hanggang ang isang karagdagang read na ito counter ang dulo ng file. 151 00:08:40,549 --> 00:08:43,210 Kaya, tamang kondisyon ay ang mga sumusunod: 152 00:08:43,210 --> 00:08:49,330 fgets at ng tatlong argumento - output, laki ng output, at fp - 153 00:08:49,330 --> 00:08:52,570 at ang lahat na hindi katumbas sa null. 154 00:08:52,570 --> 00:08:55,260 Ito ay ang diskarte na kinuha namin sa printer.c, 155 00:08:55,260 --> 00:08:57,890 at sa kasong ito, matapos ang labasan ng loop, 156 00:08:57,890 --> 00:09:04,290 maaari kang tumawag feof o ferror upang ipaalam ang user sa tiyak na pagdadahilan para sa paglabas ng loop na ito. 157 00:09:04,290 --> 00:09:08,100 >> Pagsulat sa at pagbabasa mula sa isang file ay, sa kanyang pinaka-pangunahing, 158 00:09:08,100 --> 00:09:10,150 isang simpleng proseso ng 3-bahagi. 159 00:09:10,150 --> 00:09:12,530 Una, buksan namin ang file. 160 00:09:12,530 --> 00:09:16,740 Pangalawa, inilalagay namin ang ilang mga bagay sa aming file o ang ilang mga bagay na hindi nito. 161 00:09:16,740 --> 00:09:19,200 Ikatlo, naming isara ang file. 162 00:09:19,200 --> 00:09:21,170 Ang una at huling bahagi ay madali. 163 00:09:21,170 --> 00:09:23,920 Ang gitnang bahagi ay kung saan ang nakakalito bagay ay namamalagi. 164 00:09:23,920 --> 00:09:27,760 At bagaman sa ilalim ng hood laging kami ay pagharap sa isang mahabang pagkakasunud-sunod ng mga zero at mga, 165 00:09:27,760 --> 00:09:30,710 ito ay makatulong kapag coding upang magdagdag ng isang layer ng abstraction 166 00:09:30,710 --> 00:09:35,350 na lumiliko ang pagkakasunud-sunod sa isang bagay na mas malapit kahawig kung ano ang namin ang nakasanayan mong nakikita. 167 00:09:35,350 --> 00:09:39,570 Halimbawa, kung nagsusumikap kami na may 24-bit bitmap file, 168 00:09:39,570 --> 00:09:43,290 namin malamang na pagbabasa o pagsusulat ng tatlong bytes sa isang pagkakataon. 169 00:09:43,290 --> 00:09:46,450 Sa aling mga kaso, ay ito gumawa ng kahulugan upang tukuyin at angkop na pangalanan 170 00:09:46,450 --> 00:09:48,980 struct na 3 bytes malaking. 171 00:09:48,980 --> 00:09:51,410 >> Kahit na ang nagtatrabaho na may mga file ay maaaring mukhang kumplikado, 172 00:09:51,410 --> 00:09:54,530 paggamit ng mga ito ay nagbibigay-daan sa amin upang gawin ang isang bagay na tunay na kahanga-hangang. 173 00:09:54,530 --> 00:09:58,880 Maaari naming baguhin ang estado ng mundo sa labas ng aming programa, 174 00:09:58,880 --> 00:10:01,730 maaari naming lumikha ng isang bagay na naninirahan higit sa buhay ng aming programa, 175 00:10:01,730 --> 00:10:07,190 o maaari naming baguhin ang isang bagay na ay nilikha bago nagsimula nang tumakbo ang aming programa. 176 00:10:07,190 --> 00:10:11,210 Pakikisalamuha sa mga file ay isang tunay na malakas na bahagi ng programming sa C. 177 00:10:11,210 --> 00:10:15,300 at ako nasasabik upang makita kung ano ang iyong pagpunta sa lumikha sa ito sa code darating. 178 00:10:15,300 --> 00:10:19,770 Ang pangalan ko ay Jason Hirschhorn. Ito ay CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Tawa] 181 00:10:25,940 --> 00:10:29,330 Okay. Isa tumagal. Narito kami. 182 00:10:49,000 --> 00:10:52,140 Kapag sa tingin namin ng isang file - >> Oh, maghintay. Sorry. 183 00:10:52,140 --> 00:10:56,800 [Tawa] Okay. 184 00:11:06,620 --> 00:11:09,970 Uy doon. 185 00:11:13,670 --> 00:11:16,310 Kapag sa tingin namin ng isang file - 186 00:11:17,610 --> 00:11:20,710 Kapag sa tingin mo ng isang file - Okay. Sabihin sa akin kapag handa ka na. 187 00:11:20,710 --> 00:11:22,520 Oh, mahusay. 188 00:11:22,520 --> 00:11:26,180 Kahit na pagbabasa mula sa isang teleprompter ay maaaring mukhang - walang. Aking masama.