1 00:00:00,000 --> 00:00:05,330 2 00:00:05,330 --> 00:00:07,870 >> Tagapagsalita: Sa ngayon, malamang na ang karamihan ng iyong mga programa 3 00:00:07,870 --> 00:00:10,170 ay isang bit panandalian. 4 00:00:10,170 --> 00:00:13,310 Nagpapatakbo ka ng isang programa tulad ng Mario o matakaw. 5 00:00:13,310 --> 00:00:17,350 Ito ay isang bagay, ito marahil senyales ang user para sa ilang mga impormasyon, 6 00:00:17,350 --> 00:00:20,400 i-print ang ilang mga output sa screen, ngunit pagkatapos ay kapag ang iyong programa ay higit sa, 7 00:00:20,400 --> 00:00:23,252 may tunay na walang katibayan doon ito ay kailanman tumakbo sa unang lugar. 8 00:00:23,252 --> 00:00:25,960 Ibig kong sabihin, sigurado, maaari kang magkaroon ng kaliwa buksan ito sa terminal na window, 9 00:00:25,960 --> 00:00:29,770 ngunit kung i-clear mo ang iyong screen, may talagang walang katibayan na ito umiiral. 10 00:00:29,770 --> 00:00:33,720 Wala kaming isang paraan ng pag-iimbak persistent impormasyon, impormasyon 11 00:00:33,720 --> 00:00:36,890 na umiiral pagkatapos ng aming program ay tumigil sa pagtakbo, 12 00:00:36,890 --> 00:00:39,241 o kami ay may hindi hanggang sa puntong ito. 13 00:00:39,241 --> 00:00:41,490 Sa kabutihang palad bagaman, c ginagawa magbigay sa amin ng kakayahan 14 00:00:41,490 --> 00:00:44,220 upang gawin ito sa pamamagitan ng pagpapatupad isang bagay na tinatawag 15 00:00:44,220 --> 00:00:48,330 isang file, ang isang istraktura na talaga ay kumakatawan sa isang file na nais mong i-double 16 00:00:48,330 --> 00:00:53,826 mag-click sa iyong computer, kung ikaw ay ginagamit sa isang graphical user na kapaligiran. 17 00:00:53,826 --> 00:00:55,700 Karaniwan kapag nagtatrabaho may c, hindi namin talaga 18 00:00:55,700 --> 00:00:59,965 pumapasok sa trabaho ay may mga payo sa files-- file stars-- 19 00:00:59,965 --> 00:01:02,090 maliban para sa isang maliit na piraso kapag kami makipag-usap tungkol sa isang pares 20 00:01:02,090 --> 00:01:04,560 ng pag-andar na gumagana sa mga payo file. 21 00:01:04,560 --> 00:01:08,990 Hindi mo na kailangan upang magkaroon ng tunay na utong masyadong malalim sa pag-unawa mga payo 22 00:01:08,990 --> 00:01:09,730 sa kanilang sarili. 23 00:01:09,730 --> 00:01:12,870 May isang maliit na maliit bit kung saan kami ay makipag-usap tungkol sa mga ito, 24 00:01:12,870 --> 00:01:18,090 ngunit sa pangkalahatan maghain payo at payo, habang magkakaugnay, 25 00:01:18,090 --> 00:01:20,290 ay hindi eksakto ang parehong bagay. 26 00:01:20,290 --> 00:01:22,440 >> Ngayon kung ano ang ibig sabihin ako kapag Sinasabi ko persistent data? 27 00:01:22,440 --> 00:01:23,650 Ano ang persistent data? 28 00:01:23,650 --> 00:01:25,232 Bakit pag-aalaga namin ang tungkol dito? 29 00:01:25,232 --> 00:01:27,190 Sabihin nating, halimbawa, na ikaw ay nagpapatakbo ng isang programa 30 00:01:27,190 --> 00:01:29,850 o mo na muling pagsusulat ng isang programa na ay isang laro, 31 00:01:29,850 --> 00:01:32,960 at nais mong subaybayan ng lahat ng mga gumagalaw ng gumagamit 32 00:01:32,960 --> 00:01:36,620 kaya na siguro kung may mangyaring hindi mabuti, maaari mong suriin ang mga file pagkatapos ng laro. 33 00:01:36,620 --> 00:01:39,970 Iyon ay kung ano ang ibig sabihin namin kapag kami makipag-usap tungkol persistent data. 34 00:01:39,970 --> 00:01:43,930 >> Sa kurso ng pagpapatakbo ng iyong programa, ang isang file ay nilikha. 35 00:01:43,930 --> 00:01:45,680 At kapag ang iyong programa ay tumigil sa pagtakbo, 36 00:01:45,680 --> 00:01:48,689 Umiiral pa rin ang file sa iyong system. 37 00:01:48,689 --> 00:01:50,230 At maaari naming tumingin sa ito at suriin ito. 38 00:01:50,230 --> 00:01:53,670 At kaya ay itinakda sa programa na ay lumikha ng ilang mga paulit-ulit na data, 39 00:01:53,670 --> 00:01:57,390 umiiral data pagkatapos ng programa ay tapos na tumatakbo. 40 00:01:57,390 --> 00:02:02,320 >> Ngayon ang lahat ng mga function na ang trabaho sa paglikha ng mga file at pagmamanipula 41 00:02:02,320 --> 00:02:04,940 ang mga ito sa iba't ibang paraan manirahan sa standard io.h, 42 00:02:04,940 --> 00:02:08,210 kung saan ay isang header na file malamang na napuntahan mo na pound 43 00:02:08,210 --> 00:02:10,910 kabilang sa tuktok ng pretty magkano ang lahat ng iyong mga programa 44 00:02:10,910 --> 00:02:14,130 dahil naglalaman ito ng isa sa mga pinaka-kapaki-pakinabang na pag-andar para sa amin, 45 00:02:14,130 --> 00:02:16,130 printf, na nagbibigay-daan din nabubuhay sa standard io.h. 46 00:02:16,130 --> 00:02:20,400 Kaya hindi mo na kailangan na libra isama anumang karagdagang mga file marahil 47 00:02:20,400 --> 00:02:23,540 upang gumana sa mga payo file. 48 00:02:23,540 --> 00:02:29,980 >> Ngayon bawat solong function file pointer, o bawat solong file I / O, input output 49 00:02:29,980 --> 00:02:33,310 function, tumatanggap bilang isa ng kanyang mga parameter o input 50 00:02:33,310 --> 00:02:35,822 isang pointer-- file maliban para sa isa, fopen, na 51 00:02:35,822 --> 00:02:38,280 ay kung ano ang ginagamit mo upang makuha ang file pointer sa unang lugar. 52 00:02:38,280 --> 00:02:41,010 Ngunit pagkatapos mong binuksan ang maghain at makakuha ka ng mga payo file, 53 00:02:41,010 --> 00:02:43,510 maaari mong pagkatapos ay ipasa ang mga ito bilang argumento sa iba't-ibang mga pag-andar 54 00:02:43,510 --> 00:02:46,720 kami ay pagpunta sa makipag-usap tungkol ngayon, pati na rin ang marami pang iba 55 00:02:46,720 --> 00:02:48,520 sa gayon ay maaari kang magtrabaho kasama ng mga file. 56 00:02:48,520 --> 00:02:50,980 >> Kaya may mga anim na pretty karaniwang mga pangunahing iyan 57 00:02:50,980 --> 00:02:52,870 na kami ay pagpunta sa makipag-usap tungkol sa ngayon. 58 00:02:52,870 --> 00:02:57,160 fopen at kasamahan nito function na fclose, fgetc 59 00:02:57,160 --> 00:03:02,670 at ang kasama nito function na fputc, at fread at ang kasama nito function, 60 00:03:02,670 --> 00:03:03,820 fwrite. 61 00:03:03,820 --> 00:03:05,180 Kaya sabihin makakuha ng karapatan sa mga ito. 62 00:03:05,180 --> 00:03:07,050 >> fopen-- ano ang ginagawa nito? 63 00:03:07,050 --> 00:03:10,050 Well, ito ay bumubukas ng isang file at ito nagbibigay sa iyo ng isang file pointer sa mga ito, 64 00:03:10,050 --> 00:03:14,000 upang maaari mong pagkatapos ay gamitin na maghain pointer bilang isang argument 65 00:03:14,000 --> 00:03:16,730 sa alinman sa mga iba pang mga I / O function file. 66 00:03:16,730 --> 00:03:19,100 Ang pinaka importanteng bagay tandaan na may fopen 67 00:03:19,100 --> 00:03:24,222 ay na pagkatapos mong binuksan ang maghain o ginawa ng isang tawag na tulad ng isa dito, 68 00:03:24,222 --> 00:03:26,930 kailangan mong suriin upang matiyak na na ang pointer na ba kayong bumalik 69 00:03:26,930 --> 00:03:28,320 ay hindi kapantay sa null. 70 00:03:28,320 --> 00:03:31,320 Kung hindi mo pa napanood ang video sa mga payo, ito ay hindi maaaring magkaroon ng kahulugan. 71 00:03:31,320 --> 00:03:35,639 Ngunit kung susubukan mo at dereference isang null pointer pagpapabalik, 72 00:03:35,639 --> 00:03:38,180 Marahil ay magdusa ang iyong programa isang segmentation [hindi marinig]. 73 00:03:38,180 --> 00:03:40,540 Gusto naming siguraduhin na kami Nakatanggap ng isang lehitimong pointer likod. 74 00:03:40,540 --> 00:03:43,665 Ginagamit ng karamihan ng mga oras na kami ay may tapat na paraan ng isang lehitimong pointer sa likod 75 00:03:43,665 --> 00:03:45,280 at ito ay hindi isang problema. 76 00:03:45,280 --> 00:03:46,760 >> Kaya paano namin gumawa ng isang tawag sa fopen? 77 00:03:46,760 --> 00:03:48,051 Mukhang medyo marami tulad nito. 78 00:03:48,051 --> 00:03:52,690 File star ptr-- ptr pagiging isang generic pangalan para sa file pointer-- fopen 79 00:03:52,690 --> 00:03:57,300 at pumasa kami sa loob ng dalawang mga bagay-bagay, ang isang pangalan ng file at isang operasyon nais naming idaos. 80 00:03:57,300 --> 00:04:01,690 Kaya maaari naming magkaroon ng isang tawag na ganito ang hitsura this-- file star ptr 1 ay katumbas fopen 81 00:04:01,690 --> 00:04:04,040 file1.txt. 82 00:04:04,040 --> 00:04:07,020 At ang mga operasyon na pinili ko ay r. 83 00:04:07,020 --> 00:04:08,639 >> Kaya kung ano ang tingin mo r ay dito? 84 00:04:08,639 --> 00:04:11,180 Ano ang mga uri ng mga bagay na aming maaaring magawa sa mga file? 85 00:04:11,180 --> 00:04:13,760 86 00:04:13,760 --> 00:04:17,500 Kaya r ay ang operasyon na tayo piliin kapag gusto naming basahin ang isang file. 87 00:04:17,500 --> 00:04:20,260 Kaya gusto namin talaga kapag gumawa kami ng isang tawag na tulad nito 88 00:04:20,260 --> 00:04:25,440 maging sa pagkuha ng ating sarili ang isang file pointer tulad na pagkatapos namin ay maaaring basahin ang impormasyon 89 00:04:25,440 --> 00:04:27,770 mula file1.txt. 90 00:04:27,770 --> 00:04:34,190 >> Katulad nito, maaari naming buksan ang file 2.txt para sa pagsusulat at sa gayon ay maaari naming ipasa ptr2, 91 00:04:34,190 --> 00:04:38,210 ang file pointer na aking nilikha dito, bilang isang argument sa anumang function na 92 00:04:38,210 --> 00:04:40,080 magsusulat ng impormasyon sa isang file. 93 00:04:40,080 --> 00:04:43,767 At katulad ng pagsusulat, may din ang pagpipilian upang isama, a. 94 00:04:43,767 --> 00:04:45,600 Ang pagkakaiba sa pagitan ng pagsulat at appending 95 00:04:45,600 --> 00:04:50,920 pagiging na kapag ka magsulat sa isang file, kung gumawa ka ng isang tawag sa fopen para sa pagsusulat 96 00:04:50,920 --> 00:04:54,761 at mayroon na file iyan, pagpunta upang patungan ang buong file. 97 00:04:54,761 --> 00:04:56,510 Ito ay pagpunta sa simulan sa simula pa lamang, 98 00:04:56,510 --> 00:04:58,820 pagtanggal ng lahat ng mga impormasyon na na doon. 99 00:04:58,820 --> 00:05:02,210 >> Sapagkat kung bubuksan mo ito para appending, ito ay pumunta sa katapusan ng file 100 00:05:02,210 --> 00:05:04,340 kung may naka-text sa ito o impormasyon sa mga ito, 101 00:05:04,340 --> 00:05:06,040 at ito ay pagkatapos simulan pagsulat mula doon. 102 00:05:06,040 --> 00:05:08,570 Kaya hindi mo mawawala ang anumang mga impormasyon na iyong ginawa bago. 103 00:05:08,570 --> 00:05:12,110 Kung nais mong magsulat o magkabit uri ng depende sa sitwasyon. 104 00:05:12,110 --> 00:05:16,840 Ngunit marahil mo na alam kung ano ang tamang operasyon ay kapag dumating ang oras. 105 00:05:16,840 --> 00:05:18,020 Kaya na fopen. 106 00:05:18,020 --> 00:05:18,930 >> Ano ang tungkol fclose? 107 00:05:18,930 --> 00:05:21,600 Well, medyo lang, fclose lamang ang tumatanggap ng file pointer. 108 00:05:21,600 --> 00:05:24,000 At bilang maaari mong asahan, magsasara na file. 109 00:05:24,000 --> 00:05:29,270 At sa sandaling isinara namin ang isang file, hindi namin maaari magsagawa ng anumang higit pang mga file I / O pag-andar, 110 00:05:29,270 --> 00:05:31,420 pagbabasa o pagsusulat, sa file na iyon. 111 00:05:31,420 --> 00:05:36,444 Mayroon kaming upang muling buksan ang maghain ng isa pang oras upang 112 00:05:36,444 --> 00:05:38,610 upang magpatuloy sa pagtatrabaho sa ito gamit ang mga function I / O. 113 00:05:38,610 --> 00:05:41,520 Kaya fclose paraan tapos na kami nagtatrabaho sa mga file na ito. 114 00:05:41,520 --> 00:05:44,690 At ang lahat na kailangan namin upang pumasa sa ay ang pangalan ng isang file pointer. 115 00:05:44,690 --> 00:05:50,010 Kaya sa loob ng ilang mga slide na nakalipas, kami fopened file 1 dot text para sa pagbabasa 116 00:05:50,010 --> 00:05:52,854 at itinalaga namin na maghain pointer sa ptr1. 117 00:05:52,854 --> 00:05:55,020 Ngayon nagpasya kaming hindi namin tapos na pagbabasa mula sa file na iyon. 118 00:05:55,020 --> 00:05:56,561 Hindi natin kailangan na gawin ang anumang higit pa sa mga ito. 119 00:05:56,561 --> 00:05:58,890 Maaari lang namin fclose ptr1. 120 00:05:58,890 --> 00:06:01,950 At katulad, maaaring namin fclose ang iba pang mga bago. 121 00:06:01,950 --> 00:06:02,450 Lahat tama. 122 00:06:02,450 --> 00:06:03,700 Kaya na pagbukas at pagsara. 123 00:06:03,700 --> 00:06:05,780 Ang mga ay ang dalawang pangunahing pagsisimula ng operasyon. 124 00:06:05,780 --> 00:06:08,050 >> Ngayon gusto naming aktwal gawin ang ilang mga kawili-wiling mga bagay-bagay, 125 00:06:08,050 --> 00:06:11,940 at ang unang function na bibigyan namin ng makita na gawin iyon ay fgetc-- 126 00:06:11,940 --> 00:06:14,110 maghain makakuha ng isang character. 127 00:06:14,110 --> 00:06:17,350 Iyon ay kung ano fgetc pangkalahatan ay isalin sa. 128 00:06:17,350 --> 00:06:20,190 Ang layunin sa buhay ay ang basahin ang susunod na character, 129 00:06:20,190 --> 00:06:22,079 o kung ito ay ang iyong tunay unang tawag sa fgetc 130 00:06:22,079 --> 00:06:23,870 para sa isang partikular na file, ang unang character. 131 00:06:23,870 --> 00:06:26,210 Ngunit pagkatapos ay matapos na, mong makuha ang susunod na isa, 132 00:06:26,210 --> 00:06:31,500 ang tunay susunod na karakter ng file na iyon, at mga tindahan ng mga ito sa isang variable ng character. 133 00:06:31,500 --> 00:06:34,490 Bilang ko na ginawa namin dito, char ch katumbas fgetc, 134 00:06:34,490 --> 00:06:36,389 pumasa sa pangalan ng isang file na pointer. 135 00:06:36,389 --> 00:06:38,180 Muli, ito ay tunay mahalaga dito upang tandaan 136 00:06:38,180 --> 00:06:41,430 na sa order na magkaroon ng ang operasyon na ito ay magtagumpay, 137 00:06:41,430 --> 00:06:45,690 mismo ang file pointer must've binuksan para sa pagbabasa. 138 00:06:45,690 --> 00:06:50,589 Hindi namin maaaring basahin ang isang character mula sa isang file pointer na kami binuksan para sa pagsusulat. 139 00:06:50,589 --> 00:06:52,630 Kaya na ang isa sa mga limitasyon ng fopen, di ba? 140 00:06:52,630 --> 00:06:55,470 Mayroon kaming upang rendahan ang ating mga sarili upang lamang gumaganap 141 00:06:55,470 --> 00:06:57,710 isang operasyon na may isang file pointer. 142 00:06:57,710 --> 00:07:00,220 Kung gusto naming basahin at isulat mula sa parehong file, 143 00:07:00,220 --> 00:07:03,840 gusto naming magkaroon ng open dalawang magkahiwalay payo file sa parehong file-- 144 00:07:03,840 --> 00:07:05,670 isa para sa pagbabasa, isa para sa pagsusulat. 145 00:07:05,670 --> 00:07:08,400 >> Kaya muli, ang tanging dahilan Magdadala ako na hanggang ngayon ay 146 00:07:08,400 --> 00:07:11,920 dahil kung kami ay pagpunta sa gumawa ng isang tawag upang fgetc, na file pointer must've 147 00:07:11,920 --> 00:07:14,172 binuksan para sa pagbabasa. 148 00:07:14,172 --> 00:07:15,880 At pagkatapos ay medyo simple, lahat ng kailangan naming gawin 149 00:07:15,880 --> 00:07:17,546 ay pumasa sa pangalan ng file pointer. 150 00:07:17,546 --> 00:07:21,060 Kaya char ch katumbas fgetc ptr1. 151 00:07:21,060 --> 00:07:23,200 >> Iyan ay pagpunta sa kumuha sa amin mga susunod character-- 152 00:07:23,200 --> 00:07:25,575 o muli, kung ito ay ang unang oras na ginawa namin ang tawag na ito, 153 00:07:25,575 --> 00:07:29,750 ang unang character-- ng kahit anong file ay nakatutok sa pamamagitan ptr1. 154 00:07:29,750 --> 00:07:32,210 Alalahanin na na file 1 dot text. 155 00:07:32,210 --> 00:07:36,490 Makikita ito makuha ang unang character ng na at kami ay mag-imbak ang mga ito sa variable ch. 156 00:07:36,490 --> 00:07:37,941 Medyo tapat. 157 00:07:37,941 --> 00:07:40,190 Kaya namin lamang tumingin sa tatlong function at naka-namin 158 00:07:40,190 --> 00:07:43,070 maaaring gawin ang isang bagay na medyo kapong baka. 159 00:07:43,070 --> 00:07:46,320 >> Kaya kung namin kunin ang kakayahan ng pagkuha ng isang character 160 00:07:46,320 --> 00:07:48,943 at loop namin it-- kaya namin patuloy na makakuha ng mga character 161 00:07:48,943 --> 00:07:51,390 mula sa isang file sa loob at paulit-over-- namin ngayon 162 00:07:51,390 --> 00:07:54,500 maaaring basahin ang bawat solong character ng isang file. 163 00:07:54,500 --> 00:07:58,670 At kung i-print namin ang bawat karakter kaagad pagkatapos naming basahin ito, 164 00:07:58,670 --> 00:08:01,960 kami ngayon basahin mula sa isang file at naka-print na nilalaman nito sa screen. 165 00:08:01,960 --> 00:08:05,610 Mabisa kaming concatenated file na sa screen. 166 00:08:05,610 --> 00:08:09,670 At na kung ano ang Linux command cat ay. 167 00:08:09,670 --> 00:08:13,250 >> Kung nagta-type ka cat sa pangalan ng file, ito ay i-print out ang buong nilalaman 168 00:08:13,250 --> 00:08:15,160 ng file sa iyong terminal na window. 169 00:08:15,160 --> 00:08:19,010 At kaya ito maliit na loop dito, lamang ng tatlong linya ng code, 170 00:08:19,010 --> 00:08:23,270 ngunit ito ay epektibong mga duplicate ng Linux command cat. 171 00:08:23,270 --> 00:08:25,210 Kaya ito syntax baka tumingin ng isang maliit na kakaiba, 172 00:08:25,210 --> 00:08:26,670 ngunit narito ang kung ano ang nangyayari dito. 173 00:08:26,670 --> 00:08:31,460 Habang ch katumbas fgetc, ptr ay hindi katumbas ng EOF-- ito ay isang buong maraming sinabi, 174 00:08:31,460 --> 00:08:34,669 ngunit break ni ito down lamang ipaalam kaya malinaw sa mga syntax. 175 00:08:34,669 --> 00:08:37,169 Pinagsama-sama ko para sa kapakanan ng space, 176 00:08:37,169 --> 00:08:39,049 kahit na ito ay isang maliit na syntactically madaya. 177 00:08:39,049 --> 00:08:41,194 >> Kaya ito bahagi sa green karapatan ngayon, kung ano ang ginagawa nito? 178 00:08:41,194 --> 00:08:42,860 Well, ito lamang ang aming fgetc call, di ba? 179 00:08:42,860 --> 00:08:44,530 Nakita namin na ang bago. 180 00:08:44,530 --> 00:08:49,500 Ito ay pagkuha ng isa karakter mula sa file. 181 00:08:49,500 --> 00:08:53,220 Pagkatapos ay ihambing natin na karakter laban EOF. 182 00:08:53,220 --> 00:08:57,470 EOF ay isang espesyal na halaga na tinukoy sa standard io.h, na 183 00:08:57,470 --> 00:08:59,390 ang wakas ng file character. 184 00:08:59,390 --> 00:09:03,450 Kaya talaga kung ano ang nangyayari sa mangyayari ay ito loop ay basahin ang isang karakter, 185 00:09:03,450 --> 00:09:07,445 ihambing ito sa EOF, ang pagtatapos ng file character. 186 00:09:07,445 --> 00:09:10,070 Kung hindi sila tumutugma, kaya kami ay hindi naabot na ang dulo ng file, 187 00:09:10,070 --> 00:09:11,490 ipapakita namin i-print na mga character out. 188 00:09:11,490 --> 00:09:13,740 Pagkatapos ay magpapadala kami bumalik sa simula ng loop muli. 189 00:09:13,740 --> 00:09:18,310 Kami makakuha ng isang character, suriin laban EOF, i-print ito, at iba pa 190 00:09:18,310 --> 00:09:21,094 at iba pa at iba pa, looping sa pamamagitan sa na paraan 191 00:09:21,094 --> 00:09:22,760 hanggang naabot na namin ang dulo ng file. 192 00:09:22,760 --> 00:09:24,593 At pagkatapos ay sa pamamagitan ng puntong iyon, ay may naka-print na namin 193 00:09:24,593 --> 00:09:26,210 ang kabuuang nilalaman ng mga file. 194 00:09:26,210 --> 00:09:29,450 Kaya muli, na lamang ang nakita natin fopen, fclose, at fgetc 195 00:09:29,450 --> 00:09:34,950 at na maaari naming doblehin isang Linux terminal command. 196 00:09:34,950 --> 00:09:38,850 >> Tulad ng sinabi ko sa simula, nagkaroon kami fgetc at fputc, 197 00:09:38,850 --> 00:09:41,860 at fputc ay ang kasamahan function ng fgetc. 198 00:09:41,860 --> 00:09:44,880 At ito, bilang maaari mong isipin, ito ay ang katumbas ng sulat. 199 00:09:44,880 --> 00:09:49,440 Ito ay nagpapahintulot sa amin upang makapagsulat ng isang solong character sa isang file. 200 00:09:49,440 --> 00:09:53,290 >> Muli, ang caveat na, lamang tulad ng ito ay may fgetc, ang file 201 00:09:53,290 --> 00:09:56,660 na kami ay sumusulat upang must've naging binuksan para sa pagsulat o para appending. 202 00:09:56,660 --> 00:10:00,820 Kung sinubukan namin at gamitin fputc sa isang file na iyong binuksan namin para sa pagbabasa, 203 00:10:00,820 --> 00:10:02,760 kami ay pagpunta sa magdusa isang piraso ng isang pagkakamali. 204 00:10:02,760 --> 00:10:04,440 Ngunit ang tawag ay medyo simple. 205 00:10:04,440 --> 00:10:08,000 fputc capital A ptr2, ang lahat ng na ang pagpunta sa gawin ay ito ay 206 00:10:08,000 --> 00:10:12,040 pagpunta sa isulat ang mga titik sa A sa file 2 tuldok 207 00:10:12,040 --> 00:10:14,760 teksto, na kung saan ay ang pangalan ng maghain na binuksan namin at bibigyan ng 208 00:10:14,760 --> 00:10:17,280 ang pointer sa ptr2. 209 00:10:17,280 --> 00:10:20,430 Kaya kami ay pagpunta sa magsulat ng isang capital A sa file 2 dot text. 210 00:10:20,430 --> 00:10:24,592 At kami ay sumulat ng isang tandang point upang maghain 3 dot 211 00:10:24,592 --> 00:10:27,330 teksto, na kung saan ay nakatutok sa pamamagitan ptr3. 212 00:10:27,330 --> 00:10:29,730 Kaya muli, medyo tapat dito. 213 00:10:29,730 --> 00:10:32,727 >> Ngunit ngayon maaari naming gawin ang isa pang bagay. 214 00:10:32,727 --> 00:10:34,560 Mayroon kaming halimbawang ito lamang namin ay pagpunta sa paglipas ng 215 00:10:34,560 --> 00:10:38,950 tungkol sa pagiging magagawang ginagaya ang pusa Linux command, ang isa na mga print out 216 00:10:38,950 --> 00:10:40,500 sa screen. 217 00:10:40,500 --> 00:10:43,510 Well, ngayon na kami ay may kakayahan basahin character mula sa mga file 218 00:10:43,510 --> 00:10:46,590 at isulat ang mga character sa mga file, bakit hindi kami kapalit na lang 219 00:10:46,590 --> 00:10:50,720 tumawag sa printf sa isang tawag sa fputc. 220 00:10:50,720 --> 00:10:54,090 >> At ngayon nauulit na namin ang cp, isang tunay pangunahing utos Linux 221 00:10:54,090 --> 00:10:59,100 na usapan natin ang tungkol sa mga paraan mahaba ang nakalipas sa Linux command video. 222 00:10:59,100 --> 00:11:01,070 Na namin ang epektibong Nadoble na karapatan dito. 223 00:11:01,070 --> 00:11:04,790 Kami ay nagbabasa ng isang character at pagkatapos ay hindi namin pagsulat na character sa isa pang file. 224 00:11:04,790 --> 00:11:07,660 Nagbabasa mula sa isang file, pagsulat sa iba, nang paulit-ulit 225 00:11:07,660 --> 00:11:11,350 at sa muli hanggang maabot namin EOF. 226 00:11:11,350 --> 00:11:14,250 Mayroon kaming hanggang sa dulo ng maghain aming sinusubukan upang kopyahin mula sa. 227 00:11:14,250 --> 00:11:18,500 At sa pamamagitan ng na kami ay may nakasulat na ang lahat ng ang mga character na kailangan namin upang ang file 228 00:11:18,500 --> 00:11:19,500 na kami ay sumusulat upang. 229 00:11:19,500 --> 00:11:24,270 Kaya ito ay cp, ang Linux kopya command. 230 00:11:24,270 --> 00:11:26,550 >> Sa simula pa lamang ng ang video na ito, nagkaroon ako ng caveat 231 00:11:26,550 --> 00:11:29,840 na kami ay makipag-usap sa isang maliit na piraso tungkol sa mga payo. 232 00:11:29,840 --> 00:11:32,480 Narito ang partikular na kung saan hindi namin pagpunta sa makipag-usap tungkol sa mga payo 233 00:11:32,480 --> 00:11:34,800 bilang karagdagan sa mga payo file. 234 00:11:34,800 --> 00:11:37,870 Kaya mukhang uri ng nakakatakot ang function na ito. 235 00:11:37,870 --> 00:11:39,120 Ito ay nakuha ng ilang mga parameter. 236 00:11:39,120 --> 00:11:40,430 Mayroong maraming nagaganap dito. 237 00:11:40,430 --> 00:11:42,760 May isang pulutong ng mga iba't-ibang kulay at teksto. 238 00:11:42,760 --> 00:11:47,100 Ngunit ang tunay, ito lamang ay ang generic na bersyon ng fgetc 239 00:11:47,100 --> 00:11:50,110 na nagbibigay-daan sa amin upang makakuha ng anumang halaga ng impormasyon. 240 00:11:50,110 --> 00:11:53,560 Maaari itong maging isang bit na walang kakayahan kung hindi namin pagkuha ng mga character ng isa sa isang panahon, 241 00:11:53,560 --> 00:11:55,770 iterating sa pamamagitan ng file isang character sa isang pagkakataon. 242 00:11:55,770 --> 00:12:00,230 Hindi ba ito ay nicer upang makakuha ng 100 sa isang pagkakataon o 500 sa isang pagkakataon? 243 00:12:00,230 --> 00:12:03,250 >> Well, fread at ang kasama nito pag-andar fwrite, na kung saan namin makipag-usap tungkol sa 244 00:12:03,250 --> 00:12:05,490 sa isang segundo, nagpapahintulot sa amin upang gawin lamang na. 245 00:12:05,490 --> 00:12:08,480 Maaari naming basahin ang isang arbitrary na halaga ng impormasyon mula sa isang file 246 00:12:08,480 --> 00:12:10,290 at iniimbak namin ito sa isang lugar na pansamantala. 247 00:12:10,290 --> 00:12:12,980 Sa halip na ma-lamang magkasya ito sa isang solong variable, 248 00:12:12,980 --> 00:12:15,790 maaaring kailangan upang mag-imbak ang mga ito sa isang array. 249 00:12:15,790 --> 00:12:19,980 At ito, ipasa namin sa apat na argumento sa fread-- isang pointer 250 00:12:19,980 --> 00:12:23,940 sa lokasyon kung saan hindi namin pagpunta sa tindahan ng impormasyon, 251 00:12:23,940 --> 00:12:29,180 kung paano malaki ang bawat yunit ng impormasyon ay, kung gaano karaming mga yunit ng impormasyon 252 00:12:29,180 --> 00:12:35,192 gusto naming makuha, at mula na file na gusto naming makuha ang mga ito. 253 00:12:35,192 --> 00:12:37,150 Marahil pinakamahusay na larawan may isang halimbawa dito. 254 00:12:37,150 --> 00:12:41,640 Kaya sabihin natin na ipinahahayag natin isang hanay ng mga 10 integer. 255 00:12:41,640 --> 00:12:45,080 Lamang na ipinahayag namin sa stack nagkataon int arr 10. 256 00:12:45,080 --> 00:12:46,970 Kaya na medyo tapat. 257 00:12:46,970 --> 00:12:51,970 Kung anong ginagawa namin kahit na ngayon ay ang frecall ay kami ay pagbabasa laki ng int 258 00:12:51,970 --> 00:12:54,180 ulit 10 bytes ng impormasyon. 259 00:12:54,180 --> 00:12:59,040 Sukat ng int pagkatao four-- na ang laki ng isang integer sa c. 260 00:12:59,040 --> 00:13:02,790 >> Kaya kung ano ang aming ginagawa ay kami ay pagbabasa 40 bytes halaga ng impormasyon 261 00:13:02,790 --> 00:13:05,850 mula sa mga file na nakatutok sa pamamagitan ptr. 262 00:13:05,850 --> 00:13:08,600 At kami ay nag-iimbak ng mga 40 bytes sa tabi-tabi 263 00:13:08,600 --> 00:13:12,080 na kung saan kami ay isantabi 40 bytes halaga ng memory. 264 00:13:12,080 --> 00:13:15,970 Sa kabutihang palad, mayroon na tapos na namin na sa pamamagitan ng deklarasyon arr, na array doon. 265 00:13:15,970 --> 00:13:19,770 Iyon ay kaya ng mga humahawak 10 four-byte units. 266 00:13:19,770 --> 00:13:22,860 Kaya sa kabuuan, ito ay maaaring humawak ng 40 bytes halaga ng impormasyon. 267 00:13:22,860 --> 00:13:26,540 At ngayon kami ay pagbabasa 40 bytes ng impormasyon mula sa mga file, 268 00:13:26,540 --> 00:13:30,330 at kami ay nag-iimbak ito sa arr. 269 00:13:30,330 --> 00:13:35,470 >> Pagpapabalik mula sa video sa mga payo na ang pangalan ng isang array, tulad ng mga arr, 270 00:13:35,470 --> 00:13:38,370 ay talagang lamang ang pointer sa unang elemento nito. 271 00:13:38,370 --> 00:13:43,680 Kaya kapag kami pumasa sa arr doon, tayo ay, sa katunayan, ang pagpasa sa isang pointer. 272 00:13:43,680 --> 00:13:46,120 >> Katulad din na maaari naming gawin this-- namin na hindi namin kinakailangang 273 00:13:46,120 --> 00:13:51,200 kailangang i-save ang aming buffer sa stack. 274 00:13:51,200 --> 00:13:54,990 Kami ay magilas din maglaan isang buffer na tulad nito, ang paggamit ng malloc. 275 00:13:54,990 --> 00:13:57,340 Tandaan, kapag tayo magilas na magtalaga ng memory, 276 00:13:57,340 --> 00:14:00,550 kami ay nagse-save ang mga ito sa magbunton, hindi ang stack. 277 00:14:00,550 --> 00:14:02,110 Ngunit ito ay isang buffer pa rin. 278 00:14:02,110 --> 00:14:06,810 >> Ito pa rin, sa kasong ito, ay may hawak na 640 bytes ng impormasyon 279 00:14:06,810 --> 00:14:09,230 dahil ang isang double tumatagal ng hanggang sa walong bytes. 280 00:14:09,230 --> 00:14:11,570 At hinihingi namin para sa 80 ng mga ito. 281 00:14:11,570 --> 00:14:13,770 Gusto naming magkaroon ng space upang i-hold 80 doubles. 282 00:14:13,770 --> 00:14:17,210 Kaya 80 beses 8 ay impormasyon 640 bytes. 283 00:14:17,210 --> 00:14:21,880 At na call to fread ay pagkolekta ng 640 bytes ng impormasyon 284 00:14:21,880 --> 00:14:27,770 mula sa mga file na nakatutok sa pamamagitan ptr at pag-imbak nito ngayon sa arr2. 285 00:14:27,770 --> 00:14:32,770 >> Ngayon ay maaari naming ring ituring fread tulad ng isang call to fgetc. 286 00:14:32,770 --> 00:14:37,140 Sa kasong ito, lamang kami ay nagsisikap na makakuha ng isang character mula sa file. 287 00:14:37,140 --> 00:14:40,070 At hindi namin kailangan ang isang array upang i-hold ang isang character. 288 00:14:40,070 --> 00:14:43,170 Maaari lang namin iimbak ito sa isang variable ng character. 289 00:14:43,170 --> 00:14:46,390 >> Ang mahuli, bagaman, ay na kapag kami na lang ay isang variable, 290 00:14:46,390 --> 00:14:50,290 kailangan namin upang pumasa sa address ng variable na 291 00:14:50,290 --> 00:14:52,550 dahil pagpapabalik na ang unang argumento sa fread 292 00:14:52,550 --> 00:14:59,210 ay isang pointer sa lokasyon at memory kung saan nais namin upang mag-imbak ng impormasyon. 293 00:14:59,210 --> 00:15:01,550 Muli, ang pangalan ng isang array ay isang pointer. 294 00:15:01,550 --> 00:15:04,200 Kaya hindi namin kailangan na gawin ang ampersand array. 295 00:15:04,200 --> 00:15:07,270 Ngunit c, ang character c dito, ito ay hindi isang array. 296 00:15:07,270 --> 00:15:08,390 Ito ay isang variable lang. 297 00:15:08,390 --> 00:15:11,840 At kaya kailangan namin upang pumasa sa isang ampersand c upang ipahiwatig 298 00:15:11,840 --> 00:15:15,350 na iyon ang address kung saan nais namin upang mag-imbak ito sa isang byte ng impormasyon, 299 00:15:15,350 --> 00:15:20,479 ang isang ito ng character na kami ay pagkolekta mula ptr. 300 00:15:20,479 --> 00:15:22,270 Fwrite-- kukunin ko na pumunta sa pamamagitan ng ito ng kaunti pa 301 00:15:22,270 --> 00:15:25,440 quickly-- ay medyo marami ang eksaktong katumbas ng fread 302 00:15:25,440 --> 00:15:27,720 maliban ito ay para sa pagsusulat sa halip ng pagbabasa, lamang 303 00:15:27,720 --> 00:15:31,610 tulad ng mga other-- namin ay bukas at isara, makakuha ng isang character, 304 00:15:31,610 --> 00:15:32,530 magsulat ng isang character. 305 00:15:32,530 --> 00:15:35,040 Ngayon ay makakuha ng arbitrary halaga ng impormasyon, 306 00:15:35,040 --> 00:15:37,170 karapatan arbitrary halaga ng impormasyon. 307 00:15:37,170 --> 00:15:39,790 Kaya tulad ng dati, magagawa namin magkaroon ng isang hanay ng mga 10 integer 308 00:15:39,790 --> 00:15:43,210 na kung saan kami ay mayroon ng impormasyon na nakalagay, marahil. 309 00:15:43,210 --> 00:15:46,580 >> Ito ay malamang na ang ilang mga linya ng code na dapat pumunta sa pagitan ng dalawang 310 00:15:46,580 --> 00:15:49,990 kung saan punan ko arr sa isang bagay na mahalaga. 311 00:15:49,990 --> 00:15:51,880 Punan ko ito sa 10 iba't ibang mga integer. 312 00:15:51,880 --> 00:15:54,920 At sa halip, kung ano Ako ginagawa pagsusulat mula arr 313 00:15:54,920 --> 00:15:58,600 at pagkolekta ng impormasyon mula arr. 314 00:15:58,600 --> 00:16:02,390 At aking iniinom na impormasyon at ilagay ito sa ang file. 315 00:16:02,390 --> 00:16:05,410 >> Kaya sa halip na ito sa pagiging mula sa ang file sa buffer, 316 00:16:05,410 --> 00:16:08,790 ngayon kami ay pagpunta mula sa ang buffer sa file. 317 00:16:08,790 --> 00:16:10,580 Kaya lamang ang reverse. 318 00:16:10,580 --> 00:16:16,680 Kaya muli, tulad lamang ng dati, maaari naming Mayroon ding isang kimpal na tipak ng memory 319 00:16:16,680 --> 00:16:19,600 na kami magilas inilalaan at basahin mula sa na 320 00:16:19,600 --> 00:16:21,570 at isulat iyon sa mga file. 321 00:16:21,570 --> 00:16:24,900 >> At kami ay mayroon din ng isang solong variable may-hawak na isang byte 322 00:16:24,900 --> 00:16:27,200 ng impormasyon, tulad ng isang character. 323 00:16:27,200 --> 00:16:29,830 Ngunit muli, kailangan namin upang pumasa sa ang address ng variable na 324 00:16:29,830 --> 00:16:31,840 kapag gusto naming basahin mula dito. 325 00:16:31,840 --> 00:16:35,280 Kaya maaari naming isulat ang impormasyon nakita namin sa address na iyon 326 00:16:35,280 --> 00:16:39,050 sa file pointer, ptr. 327 00:16:39,050 --> 00:16:41,630 >> Mayroong maraming iba pang mga mahusay na file I / O function 328 00:16:41,630 --> 00:16:44,650 na gawin ang iba't-ibang mga bagay-bagay maliban mga ko na usapan natin ang tungkol sa ngayon. 329 00:16:44,650 --> 00:16:46,450 Ang isang pares ng mga maaari mong mahanap ang kapaki-pakinabang 330 00:16:46,450 --> 00:16:50,840 mga fgets at fputs, na kung saan ay ang katumbas 331 00:16:50,840 --> 00:16:56,190 ng fgetc at fputc ngunit para sa pagbabasa isang solong string mula sa isang file. 332 00:16:56,190 --> 00:16:59,020 Sa halip ng isang solong character, ito ay basahin ang isang buong string. 333 00:16:59,020 --> 00:17:02,940 fprintf, na kung saan ay nagbibigay-daan talaga mong gamitin ang printf upang makapagsulat sa file. 334 00:17:02,940 --> 00:17:05,619 Tulad lamang upang maaari mong gawin ang mga ang pagpapalit ng variable gamit 335 00:17:05,619 --> 00:17:09,900 ang mga placeholder porsiyento i at percent d, at iba pa, na may printf 336 00:17:09,900 --> 00:17:14,690 maaari mong parehas gawin ang printf string at i-print ang isang bagay 337 00:17:14,690 --> 00:17:16,800 tulad na sa isang file. 338 00:17:16,800 --> 00:17:20,720 >> fseek-- kung mayroon kang isang DVD player ay ang pagkakatulad Karaniwan ang gamit ko here-- 339 00:17:20,720 --> 00:17:23,109 ay uri ng tulad ng paggamit ng iyong rewind at fast forward 340 00:17:23,109 --> 00:17:25,819 mga pindutan upang ilipat sa paligid ng pelikula. 341 00:17:25,819 --> 00:17:28,369 Gayundin, maaari mong ilipat sa paligid ng file. 342 00:17:28,369 --> 00:17:30,250 Isa sa loob ng mga bagay-bagay na istraktura ng file 343 00:17:30,250 --> 00:17:34,270 na c gagawa para sa iyo ay isang tagapagpahiwatig ng kung saan ikaw ay nasa file. 344 00:17:34,270 --> 00:17:36,420 Sigurado ka sa pinakadulo simula, sa byte zero? 345 00:17:36,420 --> 00:17:39,290 Sigurado ka sa byte 100, byte 1000, at iba pa? 346 00:17:39,290 --> 00:17:44,340 Maaari mong gamitin ang fseek na nagkataon ilipat na indicator pasulong o paatras. 347 00:17:44,340 --> 00:17:46,744 >> At ftell, muli katulad ng isang DVD player, 348 00:17:46,744 --> 00:17:49,660 ay tulad ng isang maliit na orasan na nagsasabi kung paano mo maraming minuto at segundo ka 349 00:17:49,660 --> 00:17:52,480 Isasama sa isang partikular na pelikula. 350 00:17:52,480 --> 00:17:56,990 Sa katulad na paraan, sinasabi sa ftell mo kung paano maraming bytes ikaw ay sa ang file. 351 00:17:56,990 --> 00:18:00,210 feof ay isang iba't ibang mga bersyon ng mga tiktik kung na sa iyo 352 00:18:00,210 --> 00:18:01,700 naabot na ang dulo ng file. 353 00:18:01,700 --> 00:18:03,600 At ferror ay isang function na maaari mong gamitin 354 00:18:03,600 --> 00:18:06,959 upang tuklasin kung ang isang bagay ay maling naganap nagtatrabaho sa isang file. 355 00:18:06,959 --> 00:18:08,750 Muli, ito ay lamang scratching sa ibabaw. 356 00:18:08,750 --> 00:18:12,730 Mayroong maraming higit pa file pa rin ako / O function sa standard io.h. 357 00:18:12,730 --> 00:18:16,620 Ngunit marahil ito makakakuha ka ng nagsimula nagtatrabaho sa mga payo file. 358 00:18:16,620 --> 00:18:17,640 Ako Doug Lloyd. 359 00:18:17,640 --> 00:18:19,750 Ito ang cs50. 360 00:18:19,750 --> 00:18:21,669