1 00:00:05,330 --> 00:00:07,750 RUNĀ: Līdz šim, visticamāk, lielākā daļa jūsu programmu ir bijušas 2 00:00:07,750 --> 00:00:10,170 nedaudz īslaicīgas. 3 00:00:10,170 --> 00:00:13,310 Jūs palaižat tādu programmu kā Mario vai Greedy. 4 00:00:13,310 --> 00:00:15,795 Tā kaut ko dara, iespējams, liek lietotājam ievadīt kādu informāciju, 5 00:00:15,795 --> 00:00:18,281 izdrukā kādu izvadi uz ekrāna, bet pēc tam, kad jūsu programma ir 6 00:00:18,281 --> 00:00:20,766 beigusies, patiesībā nav nekādu pierādījumu, ka tā jebkad ir bijusi 7 00:00:20,766 --> 00:00:23,252 palaista. 8 00:00:23,252 --> 00:00:26,511 Es domāju, protams, jūs, iespējams, atstājāt to atvērtu termināļa 9 00:00:26,511 --> 00:00:29,770 logā, taču, ja notīrīsit ekrānu, nekas neliecina, ka tā pastāvēja. 10 00:00:29,770 --> 00:00:32,927 Mums nav līdzekļu, lai saglabātu pastāvīgu informāciju, informāciju, 11 00:00:32,927 --> 00:00:36,084 kas saglabājas pēc mūsu programmas darbības pārtraukšanas, vai arī 12 00:00:36,084 --> 00:00:39,241 mēs vēl neesam tikuši līdz šim brīdim. 13 00:00:39,241 --> 00:00:42,887 Par laimi, c tomēr nodrošina mums iespēju to izdarīt, ieviešot kaut 14 00:00:42,887 --> 00:00:46,533 ko, ko sauc par failu, struktūru, kas būtībā attēlo failu, uz kura 15 00:00:46,533 --> 00:00:50,179 jūs datorā veiktu dubultklikšķi, ja esat pieradis pie grafiskas 16 00:00:50,179 --> 00:00:53,826 lietotāja vides. 17 00:00:53,826 --> 00:00:57,404 Parasti, strādājot ar c, mēs faktiski strādāsim ar norādēm uz 18 00:00:57,404 --> 00:01:00,982 failiem — failu zvaigznītēm — izņemot mazliet, kad mēs runājam par 19 00:01:00,982 --> 00:01:04,560 dažām funkcijām, kas darbojas ar failu rādītājiem. 20 00:01:04,560 --> 00:01:09,730 Jums nav nepieciešams pārāk dziļi izprast pašās norādes. 21 00:01:09,730 --> 00:01:15,010 Mēs par tām nedaudz parunāsim, taču parasti faila norādes un norādes, 22 00:01:15,010 --> 00:01:20,290 lai arī ir savstarpēji saistītas, nav gluži viena un tā pati lieta. 23 00:01:20,290 --> 00:01:22,440 Ko es domāju, kad es saku pastāvīgi dati? 24 00:01:22,440 --> 00:01:23,650 Kas ir pastāvīgi dati? 25 00:01:23,650 --> 00:01:25,232 Kāpēc mums tas rūp? 26 00:01:25,232 --> 00:01:28,079 Piemēram, sakiet, ka izmantojat programmu vai esat pārrakstījis 27 00:01:28,079 --> 00:01:30,926 programmu, kas ir spēle, un vēlaties sekot līdzi visām lietotāja 28 00:01:30,926 --> 00:01:33,773 darbībām, lai, ja kaut kas noiet greizi, varētu pārskatīt failu pēc 29 00:01:33,773 --> 00:01:36,620 spēles. 30 00:01:36,620 --> 00:01:39,970 Tas ir tas, ko mēs domājam, runājot par pastāvīgiem datiem. 31 00:01:39,970 --> 00:01:43,930 Programmas darbības laikā tiek izveidots fails. 32 00:01:43,930 --> 00:01:46,309 Un, kad jūsu programma ir pārtraukusi darboties, šis fails joprojām 33 00:01:46,309 --> 00:01:48,689 pastāv jūsu sistēmā. 34 00:01:48,689 --> 00:01:50,230 Un mēs varam to apskatīt un pārbaudīt. 35 00:01:50,230 --> 00:01:53,810 Un tā, lai programma būtu izveidojusi dažus pastāvīgus datus, dati 36 00:01:53,810 --> 00:01:57,390 pastāv pēc programmas darbības pabeigšanas. 37 00:01:57,390 --> 00:02:01,138 Tagad visas šīs funkcijas, kas darbojas ar failu izveidi un dažādu 38 00:02:01,138 --> 00:02:04,886 veidu manipulācijām ar tiem, ir pieejamas standarta io.h failā, kas 39 00:02:04,886 --> 00:02:08,634 ir galvenes fails, kas, iespējams, ir atrodams, tostarp gandrīz visu 40 00:02:08,634 --> 00:02:12,382 savu programmu augšdaļā, jo tajā ir viena no mums noderīgākajām 41 00:02:12,382 --> 00:02:16,130 funkcijām, printf, kas ļauj dzīvot arī standarta io.h. 42 00:02:16,130 --> 00:02:19,835 Tāpēc, iespējams, lai strādātu ar failu norādēm, jums nav jāiekļauj 43 00:02:19,835 --> 00:02:23,540 papildu faili. 44 00:02:23,540 --> 00:02:27,225 Tagad katra atsevišķa faila rādītāja funkcija vai katra atsevišķa 45 00:02:27,225 --> 00:02:30,910 faila I/O, ievades izvades funkcija, pieņem kā vienu no saviem 46 00:02:30,910 --> 00:02:34,595 parametriem vai ievada faila rādītāju — izņemot vienu, fopen, kas ir 47 00:02:34,595 --> 00:02:38,280 tas, ko jūs izmantojat, lai faila rādītāju ievietotu pirmā vieta. 48 00:02:38,280 --> 00:02:41,693 Bet pēc tam, kad esat atvēris failu un saņemat faila norādes, varat 49 00:02:41,693 --> 00:02:45,106 tos nodot kā argumentus dažādām funkcijām, par kurām mēs šodien 50 00:02:45,106 --> 00:02:48,520 runāsim, kā arī daudzām citām, lai varētu strādāt ar failiem. 51 00:02:48,520 --> 00:02:50,695 Tātad ir seši diezgan izplatīti pamata veidi, par kuriem mēs šodien 52 00:02:50,695 --> 00:02:52,870 runāsim. 53 00:02:52,870 --> 00:02:58,345 fopen un tā pavadošā funkcija fclose, fgetc un tā pavadošā funkcija 54 00:02:58,345 --> 00:03:03,820 fputc, un fread un tās pavadošā funkcija fwrite. 55 00:03:03,820 --> 00:03:05,180 Tāpēc skatīsim tieši to. 56 00:03:05,180 --> 00:03:07,050 fopen — ko tas dara? 57 00:03:07,050 --> 00:03:10,276 Tā atver failu un dod jums uz to faila rādītāju, lai jūs varētu 58 00:03:10,276 --> 00:03:13,503 izmantot šo faila rādītāju kā argumentu jebkurai citai faila I/O 59 00:03:13,503 --> 00:03:16,730 funkcijai. 60 00:03:16,730 --> 00:03:20,593 Vissvarīgākais, kas jāatceras, izmantojot fopen, ir tas, ka pēc faila 61 00:03:20,593 --> 00:03:24,456 atvēršanas vai zvanīšanas, piemēram, šeit, jums ir jāpārbauda, vai 62 00:03:24,456 --> 00:03:28,320 rādītājs, kuru atgriezāt, nav vienāds ar nulli. 63 00:03:28,320 --> 00:03:31,320 Ja neesat skatījies video par norādēm, tam var nebūt jēgas. 64 00:03:31,320 --> 00:03:38,180 segmentācija [dzirdams]. 65 00:03:38,180 --> 00:03:40,540 Mēs vēlamies pārliecināties, ka esam atgriezuši īsto norādi . 66 00:03:40,540 --> 00:03:42,910 Lielāko daļu laika mēs būsim dabūjuši atpakaļ īsto norādi , un tā 67 00:03:42,910 --> 00:03:45,280 nebūs problēma. 68 00:03:45,280 --> 00:03:46,760 Tātad, kā mēs varam izsaukt fopen? 69 00:03:46,760 --> 00:03:48,051 Tas izskatās diezgan līdzīgi šim. 70 00:03:48,051 --> 00:03:51,134 Faila zvaigznīte ptr — ptr ir vispārīgs faila norādesnosaukums — 71 00:03:51,134 --> 00:03:54,217 fopen, un mēs nododam divas lietas: faila nosaukumu un darbību, ko 72 00:03:54,217 --> 00:03:57,300 vēlamies veikt. 73 00:03:57,300 --> 00:04:00,670 Tāpēc mums varētu būt izsaukums, kas izskatās šādi — faila zvaigznīte 74 00:04:00,670 --> 00:04:04,040 ptr 1 ir vienāds ar fopen file1.txt. 75 00:04:04,040 --> 00:04:07,020 Un operācija, ko esmu izvēlējusies, ir r. 76 00:04:07,020 --> 00:04:08,639 Tātad, kas, jūsuprāt, šeit ir r? 77 00:04:08,639 --> 00:04:11,180 Kādas darbības mēs varētu darīt ar failiem? 78 00:04:13,760 --> 00:04:17,500 Tātad r ir darbība, kuru mēs izvēlamies, kad vēlamies lasīt failu. 79 00:04:17,500 --> 00:04:22,635 Tātad, veicot šādu zvanu, mēs principā iegūtu faila norādi, lai mēs 80 00:04:22,635 --> 00:04:27,770 varētu nolasīt informāciju no faila file1.txt. 81 00:04:27,770 --> 00:04:31,873 Līdzīgi mēs varētu atvērt failu 2.txt rakstīšanai, lai mēs varētu 82 00:04:31,873 --> 00:04:35,976 nodot ptr2, faila norādi, kuru esmu izveidojis šeit, kā argumentu 83 00:04:35,976 --> 00:04:40,080 jebkurai funkcijai, kas ieraksta informāciju failā. 84 00:04:40,080 --> 00:04:43,767 Līdzīgi kā rakstīšanai, ir arī iespēja pievienot, a. 85 00:04:43,767 --> 00:04:47,431 Atšķirība starp rakstīšanu un pievienošanu ir tāda, ka, rakstot 86 00:04:47,431 --> 00:04:51,096 failā, izsaucat fopen rakstīšanai un šis fails jau pastāv, tas 87 00:04:51,096 --> 00:04:54,761 pārrakstīs visu failu. 88 00:04:54,761 --> 00:04:58,820 Tas sāksies pašā sākumā, dzēšot visu jau esošo informāciju. 89 00:04:58,820 --> 00:05:01,226 Savukārt, ja to atverat pievienošanai, tas nonāks faila beigās, ja 90 00:05:01,226 --> 00:05:03,633 tajā jau ir teksts vai informācija, un pēc tam tas sāks rakstīt no 91 00:05:03,633 --> 00:05:06,040 turienes. 92 00:05:06,040 --> 00:05:08,570 Tātad jūs nezaudēsit nekādu informāciju, ko esat ievadījis iepriekš. 93 00:05:08,570 --> 00:05:12,110 Tas, vai vēlaties rakstīt vai pievienot, ir atkarīgs no situācijas. 94 00:05:12,110 --> 00:05:14,475 Bet jūs droši vien uzzināsiet, kāda ir pareizā darbība, kad pienāks 95 00:05:14,475 --> 00:05:16,840 laiks. 96 00:05:16,840 --> 00:05:18,020 Tātad tas ir fopen. 97 00:05:18,020 --> 00:05:18,930 Kā ar fclose? 98 00:05:18,930 --> 00:05:21,600 Nu, gluži vienkārši, fclose vienkārši pieņem faila norādi. 99 00:05:21,600 --> 00:05:24,000 Un, kā jūs varētu gaidīt, tas aizver šo failu. 100 00:05:24,000 --> 00:05:27,710 Pēc faila aizvēršanas mēs vairs nevaram veikt nekādas faila 101 00:05:27,710 --> 00:05:31,420 ievades/izvades funkcijas — lasīšanas vai rakstīšanas šajā failā. 102 00:05:31,420 --> 00:05:35,015 Mums ir atkārtoti jāatver fails citreiz, lai turpinātu strādāt ar to, 103 00:05:35,015 --> 00:05:38,610 izmantojot I/O funkcijas. 104 00:05:38,610 --> 00:05:41,520 Tātad fclose nozīmē, ka esam pabeiguši darbu ar šo failu. 105 00:05:41,520 --> 00:05:44,690 Un viss, kas mums jāievada, ir faila norādesnosaukums. 106 00:05:44,690 --> 00:05:48,772 Tāpēc pirms dažiem slaidiem mēs atvērām faila 1 punkta tekstu 107 00:05:48,772 --> 00:05:52,854 lasīšanai un piešķīrām šī faila norādiptr1. 108 00:05:52,854 --> 00:05:55,020 Tagad esam nolēmuši, ka esam pabeiguši šī faila lasīšanu. 109 00:05:55,020 --> 00:05:56,561 Mums ar to nekas vairāk nav jādara. 110 00:05:56,561 --> 00:05:58,890 Mēs varam vienkārši fclose ptr1. 111 00:05:58,890 --> 00:06:01,950 Un līdzīgi, vai mēs varētu aizvērt pārējās. 112 00:06:01,950 --> 00:06:02,450 Labi. 113 00:06:02,450 --> 00:06:03,700 Tātad tā ir atvēršana un aizvēršana. 114 00:06:03,700 --> 00:06:05,780 Tās ir divas pamata sākuma darbības. 115 00:06:05,780 --> 00:06:08,556 Tagad mēs vēlamies paveikt dažas interesantas lietas, un pirmā 116 00:06:08,556 --> 00:06:11,333 funkcija, ko mēs redzēsim, kas to darīs, ir fgetc — fails iegūst 117 00:06:11,333 --> 00:06:14,110 rakstzīmi. 118 00:06:14,110 --> 00:06:17,350 Tas ir tas, ko fgetc parasti nozīmētu. 119 00:06:17,350 --> 00:06:20,610 Tā mērķis dzīvē ir nolasīt nākamo rakstzīmi vai, ja šis ir jūsu 120 00:06:20,610 --> 00:06:23,870 pirmais fgetc izsaukums konkrētam failam, pirmo rakstzīmi. 121 00:06:23,870 --> 00:06:27,685 Bet pēc tam jūs saņemat nākamo, šī faila nākamo rakstzīmi, un 122 00:06:27,685 --> 00:06:31,500 saglabājat to rakstzīmju mainīgajā. 123 00:06:31,500 --> 00:06:33,944 Kā mēs šeit esam darījuši, char ch ir vienāds ar fgetc, ievadiet 124 00:06:33,944 --> 00:06:36,389 faila rādītāja nosaukumu. 125 00:06:36,389 --> 00:06:41,039 Šeit atkal ir ļoti svarīgi atcerēties, ka, lai šī darbība būtu 126 00:06:41,039 --> 00:06:45,690 veiksmīga, pašai faila norādeiir jābūt atvērtai lasīšanai. 127 00:06:45,690 --> 00:06:48,139 Mēs nevaram nolasīt rakstzīmi no faila norādes, kuru atvērām 128 00:06:48,139 --> 00:06:50,589 rakstīšanai. 129 00:06:50,589 --> 00:06:52,630 Tātad tas ir viens no fopen ierobežojumiem, vai ne? 130 00:06:52,630 --> 00:06:55,170 Mums ir jāierobežo tikai vienas darbības veikšana ar vienu faila 131 00:06:55,170 --> 00:06:57,710 norādi. 132 00:06:57,710 --> 00:07:00,363 Ja mēs vēlamies lasīt un rakstīt no viena faila, mums būtu jāatver 133 00:07:00,363 --> 00:07:03,016 divas atsevišķas faila norādes uz vienu un to pašu failu — viena 134 00:07:03,016 --> 00:07:05,670 lasīšanai, viena rakstīšanai. 135 00:07:05,670 --> 00:07:09,921 Atkal, vienīgais iemesls, kāpēc es to pieminu, ir tāpēc, ka, ja mēs 136 00:07:09,921 --> 00:07:14,172 izsauksim fgetc, faila norādeiir jābūt atvērtam lasīšanai. 137 00:07:14,172 --> 00:07:15,859 Un tad diezgan vienkārši, viss, kas mums jādara, ir jānodod faila 138 00:07:15,859 --> 00:07:17,546 norādesnosaukums. 139 00:07:17,546 --> 00:07:21,060 Tātad char ch ir vienāds ar fgetc ptr1. 140 00:07:21,060 --> 00:07:23,956 Tādējādi mēs iegūsim nākamo rakstzīmi — vai vēlreiz, ja šī ir pirmā 141 00:07:23,956 --> 00:07:26,853 reize, kad mēs to izsaucām, pirmo rakstzīmi — jebkuram failam, uz 142 00:07:26,853 --> 00:07:29,750 kuru norāda ptr1. 143 00:07:29,750 --> 00:07:32,210 Atcerieties, ka tas bija faila 1 punkta teksts. 144 00:07:32,210 --> 00:07:36,490 Tas iegūs pirmo rakstzīmi, un mēs to saglabāsim mainīgajā ch. 145 00:07:36,490 --> 00:07:37,941 Diezgan vienkārši. 146 00:07:37,941 --> 00:07:40,505 Tāpēc mēs esam apskatījuši tikai trīs funkcijas un jau varam paveikt 147 00:07:40,505 --> 00:07:43,070 kaut ko diezgan glītu. 148 00:07:43,070 --> 00:07:46,880 Tātad, ja mēs izmantojam šo spēju iegūt rakstzīmi un mēs veidojam 149 00:07:46,880 --> 00:07:50,690 cilpu  — tā mēs turpinām iegūt rakstzīmes no faila atkal un atkal un 150 00:07:50,690 --> 00:07:54,500 atkal, tagad mēs varam nolasīt katru faila rakstzīmi. 151 00:07:54,500 --> 00:07:58,230 Un, ja mēs izdrukājam katru rakstzīmi tūlīt pēc to izlasīšanas, mēs 152 00:07:58,230 --> 00:08:01,960 tagad esam nolasījuši no faila un izdrukājuši tā saturu uz ekrāna. 153 00:08:01,960 --> 00:08:05,610 Mēs esam efektīvi savienojuši šo failu ekrānā. 154 00:08:05,610 --> 00:08:09,670 Un to dara Linux komanda cat. 155 00:08:09,670 --> 00:08:12,415 Ja faila nosaukumā ierakstāt cat, tas izdrukās visu faila saturu jūsu 156 00:08:12,415 --> 00:08:15,160 termināļa logā. 157 00:08:15,160 --> 00:08:19,215 Un tā šī mazā cilpa šeit, tikai trīs koda rindiņas, bet tā efektīvi 158 00:08:19,215 --> 00:08:23,270 dublē Linux komandu cat. 159 00:08:23,270 --> 00:08:24,970 Tāpēc šī sintakse varētu šķist nedaudz dīvaina, taču lūk, kas šeit 160 00:08:24,970 --> 00:08:26,670 notiek. 161 00:08:26,670 --> 00:08:30,669 Kamēr ch ir vienāds ar fgetc, ptr nav vienāds ar EOF — tas ir ļoti 162 00:08:30,669 --> 00:08:34,669 svarīgi , bet sadalīsim to, lai tas būtu skaidrs sintaksē. 163 00:08:34,669 --> 00:08:36,859 Esmu to konsolidējis vietas dēļ, lai gan tas ir nedaudz sintaktiski 164 00:08:36,859 --> 00:08:39,049 sarežģīts. 165 00:08:39,049 --> 00:08:41,194 Tātad šī daļa šobrīd ir zaļā krāsā, ko tā dara? 166 00:08:41,194 --> 00:08:42,860 Nu, tas ir tikai mūsu fgetc izsaukums, vai ne? 167 00:08:42,860 --> 00:08:44,530 Mēs to esam redzējuši iepriekš. 168 00:08:44,530 --> 00:08:49,500 Tas ir vienas rakstzīmes iegūšana no faila. 169 00:08:49,500 --> 00:08:53,220 Tad mēs salīdzinām šo rakstzīmi ar EOF. 170 00:08:53,220 --> 00:08:56,305 EOF ir īpaša vērtība, kas ir definēta standartā io.h, kas ir faila 171 00:08:56,305 --> 00:08:59,390 rakstzīmes beigas. 172 00:08:59,390 --> 00:09:03,417 Tātad būtībā tas, kas notiks, ir tas, ka šī cilpa nolasīs rakstzīmi, 173 00:09:03,417 --> 00:09:07,445 salīdzinās to ar EOF, faila beigu rakstzīmi. 174 00:09:07,445 --> 00:09:09,467 Ja tās nesakrīt, mēs neesam sasnieguši faila beigas, mēs izdrukāsim 175 00:09:09,467 --> 00:09:11,490 šo rakstzīmi. 176 00:09:11,490 --> 00:09:13,740 Pēc tam mēs atkal atgriezīsimies cilpas sākumā. 177 00:09:13,740 --> 00:09:16,746 Mēs iegūsim rakstzīmi, pārbaudīsim, vai tas ir EOF, izdrukāsim to un 178 00:09:16,746 --> 00:09:19,753 tā tālāk, un tā tālāk, un tā tālāk, tādā veidā cauri visai cilpai 179 00:09:19,753 --> 00:09:22,760 līdz būsim sasnieguši faila beigas. 180 00:09:22,760 --> 00:09:26,210 Un tad līdz tam brīdim mēs būsim izdrukājuši visu faila saturu. 181 00:09:26,210 --> 00:09:30,580 Tātad atkal mēs esam redzējuši tikai fopen, fclose un fgetc, un mēs 182 00:09:30,580 --> 00:09:34,950 jau varam dublēt Linux termināļa komandu. 183 00:09:34,950 --> 00:09:38,405 Kā jau teicu sākumā, mums bija fgetc un fputc, un fputc bija fgetc 184 00:09:38,405 --> 00:09:41,860 pavadošā funkcija. 185 00:09:41,860 --> 00:09:44,880 Un tā, kā jūs varētu iedomāties, tas ir rakstīšanas ekvivalents. 186 00:09:44,880 --> 00:09:49,440 Tas ļauj failā ierakstīt vienu rakstzīmi. 187 00:09:49,440 --> 00:09:53,050 Atkal, brīdinājums, tāpat kā tas bija ar fgetc, failam, uz kuru mēs 188 00:09:53,050 --> 00:09:56,660 rakstām, ir jābūt atvērtam rakstīšanai vai pievienošanai. 189 00:09:56,660 --> 00:09:59,710 Ja mēģināsim izmantot fputc failā, kuru esam atvēruši lasīšanai, mēs 190 00:09:59,710 --> 00:10:02,760 piedzīvosim nelielu kļūdu. 191 00:10:02,760 --> 00:10:04,440 Bet zvans ir diezgan vienkāršs. 192 00:10:04,440 --> 00:10:08,720 fputc capital A ptr2, viss, kas tiks darīts, ir ierakstīt burtu A 193 00:10:08,720 --> 00:10:13,000 faila 2 punktu tekstā, kas bija faila nosaukums, kuru mēs atvērām un 194 00:10:13,000 --> 00:10:17,280 piešķīrām norādiptr2. 195 00:10:17,280 --> 00:10:20,430 Tātad mēs rakstīsim lielo A, lai failā būtu 2 punktu teksts. 196 00:10:20,430 --> 00:10:23,880 Un mēs ierakstīsim izsaukuma zīmi failā ar 3 punktu tekstu, uz kuru 197 00:10:23,880 --> 00:10:27,330 norādīja ptr3. 198 00:10:27,330 --> 00:10:29,730 Tātad šeit atkal ir diezgan vienkārši. 199 00:10:29,730 --> 00:10:32,727 Bet tagad mēs varam darīt citu lietu. 200 00:10:32,727 --> 00:10:36,613 Mums ir šis piemērs, par kuru mēs tikko runājām par to, kā varētu 201 00:10:36,613 --> 00:10:40,500 replicēt cat Linux komandu, kas tiek izdrukāta uz ekrāna. 202 00:10:40,500 --> 00:10:43,906 Tagad, kad mums ir iespēja nolasīt rakstzīmes no failiem un rakstīt 203 00:10:43,906 --> 00:10:47,313 rakstzīmes failos, kāpēc gan mēs vienkārši neaizstājam šo izsaukumu 204 00:10:47,313 --> 00:10:50,720 uz printf ar izsaukumu uz fputc. 205 00:10:50,720 --> 00:10:54,910 Un tagad mēs esam dublējuši cp — ļoti vienkāršu Linux komandu, par 206 00:10:54,910 --> 00:10:59,100 kuru mēs jau sen runājām Linux komandu video. 207 00:10:59,100 --> 00:11:01,070 Mēs to esam faktiski dublējuši tieši šeit. 208 00:11:01,070 --> 00:11:04,790 Mēs lasām rakstzīmi un pēc tam rakstām to citā failā. 209 00:11:04,790 --> 00:11:08,070 Lasīšana no viena faila, rakstīšana citā, atkal un atkal un atkal, 210 00:11:08,070 --> 00:11:11,350 līdz mēs sasniedzam EOF. 211 00:11:11,350 --> 00:11:14,250 Mēs esam nonākuši līdz faila beigām, no kura mēģinām kopēt. 212 00:11:14,250 --> 00:11:16,875 Līdz ar to mēs esam ierakstījuši visas nepieciešamās rakstzīmes 213 00:11:16,875 --> 00:11:19,500 failā, uz kuru mēs rakstām. 214 00:11:19,500 --> 00:11:24,270 Tātad šī ir cp, Linux kopēšanas komanda. 215 00:11:24,270 --> 00:11:27,055 Pašā šī video sākumā man bija brīdinājums, ka mēs nedaudz parunāsim 216 00:11:27,055 --> 00:11:29,840 par norādēm. 217 00:11:29,840 --> 00:11:34,800 Šeit mēs runāsim par norādēm papildus failu norādēm. 218 00:11:34,800 --> 00:11:37,870 Tāpēc šī funkcija izskatās biedējoša. 219 00:11:37,870 --> 00:11:39,120 Tai ir vairāki parametri. 220 00:11:39,120 --> 00:11:40,430 Šeit daudz kas notiek. 221 00:11:40,430 --> 00:11:42,760 Ir daudz dažādu krāsu un tekstu. 222 00:11:42,760 --> 00:11:46,435 Bet patiesībā tā ir tikai vispārīgā fgetc versija, kas ļauj mums 223 00:11:46,435 --> 00:11:50,110 iegūt jebkādu informācijas daudzumu. 224 00:11:50,110 --> 00:11:52,940 Tas var būt nedaudz neefektīvi, ja mēs iegūstam rakstzīmes pa vienai, 225 00:11:52,940 --> 00:11:55,770 atkārtojot failu pa vienai rakstzīmei. 226 00:11:55,770 --> 00:12:00,230 Vai nebūtu patīkamāk saņemt 100 vienā reizē vai 500 vienā reizē? 227 00:12:00,230 --> 00:12:02,860 Nu, fread un tā pavadošā funkcija fwrite, par kuru mēs runāsim pēc 228 00:12:02,860 --> 00:12:05,490 sekundes, ļauj mums to izdarīt. 229 00:12:05,490 --> 00:12:07,890 Mēs varam nolasīt noteikto informācijas daudzumu no faila, un 230 00:12:07,890 --> 00:12:10,290 īslaicīgi to glabājam. 231 00:12:10,290 --> 00:12:13,040 Tā vietā, lai to vienkārši ievietotu vienā mainīgajā, mums, 232 00:12:13,040 --> 00:12:15,790 iespējams, tas ir jāsaglabā masīvā. 233 00:12:15,790 --> 00:12:20,640 Tātad, mēs nododam fread četrus argumentus — norādi uz vietu, kur mēs 234 00:12:20,640 --> 00:12:25,491 glabāsim informāciju, cik liela būs katra informācijas vienība, cik 235 00:12:25,491 --> 00:12:30,341 informācijas vienību mēs vēlamies iegūt un no kura faila mēs vēlamies 236 00:12:30,341 --> 00:12:35,192 tos iegūt. 237 00:12:35,192 --> 00:12:37,150 Iespējams, vislabāk ilustrēt ar piemēru šeit. 238 00:12:37,150 --> 00:12:41,640 Tātad pieņemsim, ka mēs deklarējam 10 veselu skaitļu masīvu. 239 00:12:41,640 --> 00:12:45,080 Mēs tikko esam paziņojuši par lielu daudzumu noteiktu int arr 10. 240 00:12:45,080 --> 00:12:46,970 Tātad tas ir diezgan vienkārši. 241 00:12:46,970 --> 00:12:50,575 Tagad tas, ko mēs darām, ir tāds, ka mēs lasām informācijas lielumu, 242 00:12:50,575 --> 00:12:54,180 kas ir int reiz 10 baiti. 243 00:12:54,180 --> 00:12:59,040 Int lielums ir četri — tas ir vesela skaitļa lielums c. 244 00:12:59,040 --> 00:13:02,445 Tātad mēs nolasām 40 baitus vērtu informāciju no faila, uz kuru 245 00:13:02,445 --> 00:13:05,850 norādīja ptr. 246 00:13:05,850 --> 00:13:08,965 Un mēs glabājam tos 40 baitus kaut kur, kur esam rezervējuši 247 00:13:08,965 --> 00:13:12,080 40 baitus atmiņas. 248 00:13:12,080 --> 00:13:14,025 Par laimi, mēs to jau esam izdarījuši, deklarējot arr, šo masīvu 249 00:13:14,025 --> 00:13:15,970 tieši tur. 250 00:13:15,970 --> 00:13:19,770 Tas spēj turēt 10 četru baitu vienības. 251 00:13:19,770 --> 00:13:22,860 Tātad kopumā tajā var būt 40 baitu vērta informācija. 252 00:13:22,860 --> 00:13:26,595 Tagad mēs nolasām 40 baitus informācijas no faila un saglabājam to 253 00:13:26,595 --> 00:13:30,330 arr. 254 00:13:30,330 --> 00:13:34,350 Atgādiniet no video par norādēm, ka masīva nosaukums, piemēram, arr, 255 00:13:34,350 --> 00:13:38,370 patiesībā ir tikai norādeuz tā pirmo elementu. 256 00:13:38,370 --> 00:13:43,680 Tātad, kad mēs ejam garām arr tur, mēs faktiski ejam garām norādei. 257 00:13:43,680 --> 00:13:47,440 Līdzīgi mēs varam darīt to — mums nav obligāti jāsaglabā savs buferis 258 00:13:47,440 --> 00:13:51,200 kaudzē. 259 00:13:51,200 --> 00:13:54,990 Mēs varētu arī dinamiski piešķirt šādu buferi, izmantojot malloc. 260 00:13:54,990 --> 00:13:57,770 Atcerieties, ka, dinamiski piešķirot atmiņu, mēs to saglabājam 261 00:13:57,770 --> 00:14:00,550 kaudzītē, nevis kaudzē. 262 00:14:00,550 --> 00:14:02,110 Bet tas joprojām ir buferis. 263 00:14:02,110 --> 00:14:05,670 Šajā gadījumā tas joprojām glabā 640 baitus informācijas, jo 264 00:14:05,670 --> 00:14:09,230 dubultnieks aizņem astoņus baitus. 265 00:14:09,230 --> 00:14:11,570 Un mēs prasām 80 no tiem. 266 00:14:11,570 --> 00:14:13,770 Mēs vēlamies, lai būtu vieta 80 dubulskaitļiem. 267 00:14:13,770 --> 00:14:17,210 Tātad 80 reiz 8 ir 640 baitu informācija. 268 00:14:17,210 --> 00:14:22,490 Un šis izsaukums Fread savāc 640 baitus informācijas no faila, uz 269 00:14:22,490 --> 00:14:27,770 kuru norādīja ptr, un tagad to saglabā arr2. 270 00:14:27,770 --> 00:14:30,270 Tagad mēs varam arī izturēties pret Fread tāpat kā ar izsaukumu 271 00:14:30,270 --> 00:14:32,770 fgetc. 272 00:14:32,770 --> 00:14:37,140 Šajā gadījumā mēs tikai cenšamies iegūt vienu rakstzīmi no faila. 273 00:14:37,140 --> 00:14:40,070 Un mums nav nepieciešams masīvs, lai turētu rakstzīmi. 274 00:14:40,070 --> 00:14:43,170 Mēs to varam vienkārši saglabāt rakstzīmju mainīgajā. 275 00:14:43,170 --> 00:14:47,180 Tomēr jēga ir tāda, ka, ja mums ir tikai mainīgais, mums ir jānodod 276 00:14:47,180 --> 00:14:51,190 šī mainīgā adrese, jo atcerieties, ka pirmais arguments, lai 277 00:14:51,190 --> 00:14:55,200 izjauktu, ir norāde uz vietu un atmiņu, kur mēs vēlamies saglabāt 278 00:14:55,200 --> 00:14:59,210 informāciju. 279 00:14:59,210 --> 00:15:01,550 Atkal, masīva nosaukums ir norāde. 280 00:15:01,550 --> 00:15:04,200 Tāpēc mums nav jāizvei do &  array . 281 00:15:04,200 --> 00:15:07,270 Bet c, rakstzīme c šeit, nav masīvs. 282 00:15:07,270 --> 00:15:08,390 Tas ir tikai mainīgais. 283 00:15:08,390 --> 00:15:12,419 Un tāpēc mums ir jānodod burts & c, lai norādītu, ka šī ir adrese, 284 00:15:12,419 --> 00:15:16,449 kurā mēs vēlamies saglabāt šo vienu informācijas baitu, šo vienu 285 00:15:16,449 --> 00:15:20,479 rakstzīmi, ko mēs apkopojam no ptr. 286 00:15:20,479 --> 00:15:23,491 Fwrite — es to izskatīšu nedaudz ātrāk — ir gandrīz precīzs fread 287 00:15:23,491 --> 00:15:26,504 ekvivalents, izņemot to, ka tas ir paredzēts rakstīšanai, nevis 288 00:15:26,504 --> 00:15:29,517 lasīšanai, tāpat kā cits  — mums ir bijis atvērts un aizvērts, 289 00:15:29,517 --> 00:15:32,530 iegūstiet rakstzīmi, rakstiet rakstzīmi. 290 00:15:32,530 --> 00:15:34,850 Tagad ir jāiegūst noteiktu informācijas daudzumu, pareizu noteiktas 291 00:15:34,850 --> 00:15:37,170 informācijas daudzumu. 292 00:15:37,170 --> 00:15:40,190 Tātad, tāpat kā iepriekš, mums var būt 10 veselu skaitļu masīvs, 293 00:15:40,190 --> 00:15:43,210 kurā, iespējams, jau ir saglabāta informācija. 294 00:15:43,210 --> 00:15:46,600 Iespējams, ka starp šīm divām koda rindām vajadzētu būt dažām koda 295 00:15:46,600 --> 00:15:49,990 rindām, kurās es piepildu arr ar kaut ko nozīmīgu. 296 00:15:49,990 --> 00:15:51,880 Es to aizpildu ar 10 dažādiem veseliem skaitļiem. 297 00:15:51,880 --> 00:15:58,600 Un tā vietā es rakstu no arr un apkopoju informāciju no arr. 298 00:15:58,600 --> 00:16:02,390 Un es ņemu šo informāciju un ievietoju failā. 299 00:16:02,390 --> 00:16:05,590 Tā vietā, lai tas būtu no faila uz buferi, mēs tagad pārejam no 300 00:16:05,590 --> 00:16:08,790 bufera uz failu. 301 00:16:08,790 --> 00:16:10,580 Tātad ir tikai otrādi. 302 00:16:10,580 --> 00:16:16,075 Tātad, tāpat kā iepriekš, mums var būt arī liels daudzums atmiņas, ko 303 00:16:16,075 --> 00:16:21,570 esam dinamiski piešķīruši un nolasījuši no tās un ierakstām failā. 304 00:16:21,570 --> 00:16:24,385 Un mums ir arī viens mainīgais, kas spēj saturēt vienu informācijas 305 00:16:24,385 --> 00:16:27,200 baitu, piemēram, rakstzīmi. 306 00:16:27,200 --> 00:16:29,520 Bet atkal mums ir jānodod šī mainīgā adrese, kad mēs vēlamies no tā 307 00:16:29,520 --> 00:16:31,840 lasīt. 308 00:16:31,840 --> 00:16:35,445 Lai mēs varētu ierakstīt informāciju, ko atrodam šajā adresē, faila 309 00:16:35,445 --> 00:16:39,050 norādē, ptr. 310 00:16:39,050 --> 00:16:41,850 Papildus tām, par kurām mēs šodien runājām, ir daudz citu lielisku 311 00:16:41,850 --> 00:16:44,650 failu I/O funkciju, kas veic dažādas darbības. 312 00:16:44,650 --> 00:16:48,496 Daži no tiem, kas varētu būt noderīgi, ir fgets un fputs, kas ir 313 00:16:48,496 --> 00:16:52,343 līdzvērtīgi fgetc un fputc, bet ir paredzēti vienas virknes lasīšanai 314 00:16:52,343 --> 00:16:56,190 no faila. 315 00:16:56,190 --> 00:16:59,020 Vienas rakstzīmes vietā tas nolasīs visu virkni. 316 00:16:59,020 --> 00:17:02,940 fprintf, kas būtībā ļauj izmantot printf, lai rakstītu failā. 317 00:17:02,940 --> 00:17:07,560 Tātad, tāpat kā jūs varat veikt mainīgo aizstāšanu, izmantojot 318 00:17:07,560 --> 00:17:12,180 vietturus procenti i un procenti d utt., Tāpat ar printf varat ņemt 319 00:17:12,180 --> 00:17:16,800 printf virkni un izdrukāt kaut ko līdzīgu failā. 320 00:17:16,800 --> 00:17:19,806 fseek — ja jums ir DVD atskaņotājs, ir analoģija, ko es parasti 321 00:17:19,806 --> 00:17:22,812 izmantoju šeit — tā ir līdzīga attīšanas un pārtīšanas pogu 322 00:17:22,812 --> 00:17:25,819 izmantošanai, lai pārvietotos pa filmu. 323 00:17:25,819 --> 00:17:28,369 Līdzīgi varat pārvietoties pa failu. 324 00:17:28,369 --> 00:17:31,319 Viena no lietām šajā faila struktūrā, ko c jums izveido, ir rādītājs, 325 00:17:31,319 --> 00:17:34,270 kas norāda, kurā faila vietā atrodaties. 326 00:17:34,270 --> 00:17:36,420 Vai esat pašā sākumā, pie nulles baita? 327 00:17:36,420 --> 00:17:39,290 Vai jums ir 100. baits, 1000. baits un tā tālāk? 328 00:17:39,290 --> 00:17:41,815 Varat izmantot fseek, lai patvaļīgi pārvietotu šo indikatoru uz 329 00:17:41,815 --> 00:17:44,340 priekšu vai atpakaļ. 330 00:17:44,340 --> 00:17:48,410 Un ftell, atkal līdzīgs DVD atskaņotājam, ir kā mazs pulkstenis, kas 331 00:17:48,410 --> 00:17:52,480 parāda, cik minūtes un sekundes atrodaties konkrētajā filmā. 332 00:17:52,480 --> 00:17:56,990 Tāpat ftell norāda, cik baitu esat failā. 333 00:17:56,990 --> 00:17:59,345 feof ir cita versija, kas ļauj noteikt, vai esat sasniedzis faila 334 00:17:59,345 --> 00:18:01,700 beigas. 335 00:18:01,700 --> 00:18:04,329 Un ferror ir funkcija, ko varat izmantot, lai noteiktu, vai, 336 00:18:04,329 --> 00:18:06,959 strādājot ar failu, kaut kas nav noticis. 337 00:18:06,959 --> 00:18:08,750 Atkal, tas ir tikai kā braukt pa virsu. 338 00:18:08,750 --> 00:18:12,730 Standartā io.h joprojām ir daudz vairāk failu I/O funkciju. 339 00:18:12,730 --> 00:18:16,620 Bet tas, iespējams, ļaus jums sākt strādāt ar failu norādēm. 340 00:18:16,620 --> 00:18:17,640 Es esmu Dags Loids. 341 00:18:17,640 --> 00:18:19,750 Šis ir cs50.