Джэйсан Хиршхорн: Сардэчна запрашаем, усё, каб Тыдзень 6. Я шчаслівы бачыць вас усіх жывы і здаровы пасля Віктарына 0, таму што я ведаю, што было трохі груба. Але, на шчасце, вы ўсё зрабіў неверагодна добра. І так, што гэта выдатна. Калі вы знаходзіцеся ў маёй секцыі, я даў найбольш з вас падтрымаць вашыя віктарыны ўжо. Пару вас, у мяне сустрэча пасля заняткаў. І калі вы студэнт пашырэнне і Вы не атрымалі свой віктарыну назад тым не менш, ваша TF, верагодна, працаваць на ім і сартавання яго, і атрымаць яго назад Вам у бліжэйшы час. Так мае пашырэння студэнты, якія глядзець прама цяпер - мы спадзяемся жыць - Я атрымаю вашыя віктарыны неўзабаве таксама. Наша тэма дня на сёння выглядае наступным чынам. Па-першае, мы збіраемся перайсці на некаторыя рэсурсы, якія CS50 дае вам. Мы збіраемся перайсці Віктарына 0 наступны, і Я адкажу на любыя пытанні нікога мае аб канкрэтных праблем. І потым, мы будзем ісці па файлавы ўвод / выснова і праблема ўсталяваць 5. Гэтыя апошнія дзве тэмы будуць прымаць да асноўнай масы раздзеле сёння. Я паклаў гэты спіс кожны тыдзень, як напамін усім вам, але ядра раздзел, у нас ёсць толькі 90 хвілін - мы не ў стане ахапіць усё, што я вельмі хацелася б, каб пакрыць для вас, хлопцы. Але ў нас ёсць тона рэсурсаў для маляваць на як вы даведаецеся матэрыял і праца праз ваша праблема вызначае. Нагадаем, што ў мяне ёсць онлайн тэкст скрынка, створаны для вас, каб запоўніць, калі вы ёсць зваротная сувязь для мяне, як станоўчыя, так і канструктыўнымі, аб падзеле. Гэта URL размешчаны прама сюды. Так што калі ласка, знайдзіце час, калі ў вас ёсць якія-небудзь зваротная сувязь, будзь то падчас секцыі, або пасля, або пасля вы глядзіце відэа онлайн, каб даць мне сваё меркаванне. Я сапраўды цаню ўсіх і ўсё. Так што я з малымі размовы з шмат маіх студэнты на працягу тыдня - як я ўручаю назад віктарыны, кажучы пра Вядома, бачачы, як вы робіце. І адна тэма прыйшла зноў і больш казаць пра - у прыватнасці - Праблема вызначае. І я інкапсулюецца гэтую тэму на дошцы прама цяпер. Па сутнасці, ёсць розніца паміж уключэннем ў нешта, што з'яўляецца ўсё зроблена правільна і тое, што зроблена добра. Большасць людзей рабілі фантастычны з пункту гледжання правільнасці - 5 ці 4 па ўсім psets. Большасць людзей атрымліваюць тыя ўвесь час. Тым не менш, толькі таму, што вы зрабілі нешта прама не азначае, што вы маеце зрабіў нешта, як элегантна, або эфектыўна, або, як чыста, як вам мог бы зрабіць гэта. І вось што дызайн - і, у меншай ступені, стылю - восі для. Так Я штурхаю вас усіх, і іншых ТФ штурхаюць вас, хлопцы, каб не толькі сваю чаргу ў рэчах, якія з'яўляюцца правільнымі, але ператварыць ў рэчах, якія кадуюцца добра. Калі гэтага не зрабіць непатрэбным для завес, ня пералічваючы зменных, калі Вы не павінны. Напрыклад, азіраючыся на праблемы ўсталюеце 4, пры размяшчэнні цэглу на экран, кожны радок - кожная цагліна ў дадзеная радок мае той жа каардынаты ў - аднолькавую вышыню каардынатаў. Так што у-каардынату ня трэба разлічваецца ў інтэр'еры укладзенымі ДЛЯ цыкл, які вы, верагодна, выкарыстоўваецца паставіць гэтыя цэглу на экране. Гэта трэба толькі разлічвацца кожны раз, калі вы перайшлі шэраг, або з'ехаў радок. Так бы мовіць, калі ёсць 10 цэглы ў шэраг, кожная цагліна можа мець тое ж самае у-каардынату, і што каардынаты ў можа проста быць разлічана раз і назаўсёды з іх. Гэта не павінны быць разлічаны 10 раз, і не, што разлік неабходнасць адбудзецца ў фактычны выклік функцыі - новы выклік gracked функцыя. Так што, калі гэта было трохі заблытаным для Вы, у больш агульным, усё, што ня трэба адбывацца кожны раз, калі вы ідзяце праз пятлю ДЛЯ быць не павінна пакласці ўнутры цыклу FOR, і не павінны адбываецца кожны раз, калі вы ідзяце праз пятлю ДЛЯ. Іншы добры прыклад дызайну мы бачылі у 3 тыдні на працягу 15, вы маглі б трымаць трэк нуля. Такім чынам, калі вы ініцыялізацыі дошка, вам захаваць - у глабальнай зменнай, магчыма - х і у-каардынату нуля. А потым, калі вы - у ход функцыі, кожны раз, калі вы робіце ўдалы ход, абнаўленні Размяшчэнне нуля. Гэта было б выратаваць вас ад неабходнасці рабіць ўкладзеных цыклаў праглядаць борт кожны раз у ход функцыі і знайсці нуля, або знайсці плітку, , А затым праверыць, што гэта побач з ім. Замест гэтага, у вас ёсць размяшчэнне нуля, вы можаце проста паглядзець зверху, знізу, і злева і справа ад яе, каб знайсці плітка шукалі. Так што ў плане праграм мы пісаць, яны ніколі не дастаткова вялікі, што некаторыя з гэтых праектных рашэнняў сапраўды збіраецеся перашкаджаць вашаму Праграма, або зрабіць яго працаваць павольней, або, магчыма, нават не хапіць памяці. Але мы ўсё яшчэ штурхае вас, хлопцы пісаць, як элегантны і эфектыўны код, як гэта магчыма. Так што калі вы ў канчатковым выніку пісаць рэчы якія маюць значна больш Сфера, яны будуць напісаны з добрым распрацаваць у дадатак да таго правільна. Так шэраг ў вас ёсць прынёс гэта. Гэта тое, што мы шукаем - тое, што мы збіраемся працягваць падштурхнуць вас хлопцы на. Калі вы калі-небудзь ёсць якія-небудзь пытанні аб дызайн вашай праграмы, не саромейцеся дацягнуцца да мяне, і я шчаслівы хадзіць праз вашу праграму з вамі, і паказаць на некаторыя канструкцыі Рашэнні, якія вы зрабілі, і даць вам некаторыя прапановы аб тым, каб зрабіць яшчэ лепшыя дызайнерскія рашэнні. Так што мы збіраемся рухацца далей да размовы аб віктарыне 0. Перш, чым мы гэта зрабіць, хто-небудзь ёсць пытанні з нагоды таго, што Я пакрытыя да гэтага часу? [Шоргат] Джэйсан Хиршхорн: Сем секунд. ОК. Давайце пагаворым аб віктарыне 0 няшмат. Большасць з вас ёсць свой Віктарына 0 вярнуўся. Калі вы гэтага не зробіце, мы спадзяемся, Вы памятаеце яго няшмат. Але калі вы ўзялі Віктарына 0, то вы таксама маюць доступ да PDF-лайн ў Прыгатаваныя растворы. Хто-небудзь ёсць любыя пытанні перад скачам ў матэрыяле тыдні пра Асаблівай праблемай на Quiz 0 - Таму адказ, што гэта такое? Хто-небудзь блытаць ні пра што? Нават калі вы атрымалі права праблемы, але проста хацеў мне растлумачыць гэта крыху Больш за тое, я рады зрабіць гэта цяпер. Так што я спытаў вас, хлопцы, каб падрыхтаваць свае некаторыя думкі аб віктарыне 0. Так, хто хацеў бы атрымаць нас пачаў з пытання або пракаментаваць аб віктарыне 0? [ПАПЕРЫ шолах] Джэйсан Хиршхорн: Не ўсе зрабіў выдатна. Так што я ведаю [смяецца] там павінны быць некаторыя пытанні аб віктарыне 0. ОК. Так. Ompica. OMPICA: нумар 10. Джэйсан Хиршхорн: нумар 10. Які з іх быў нумар 10? OMPICA: - Джэйсан Хиршхорн: Я haven't - OMPICA: ўключаюць - Джэйсан Хиршхорн: нумар 10 было восем у I - пісаць ад васьмі да I? OMPICA: Так. Джэйсан Хиршхорн: ОК. Так яшчэ адно пытанне вы маглі б спытаў, я дарам прадбачання? Адказ: так. У раздзеле перад віктарыны, я спытаў вы, хлопцы, код Як стэрлінгаў і васьмі да я. Абодва яны, выявілася, з'яўляюцца на віктарыне. Так што, спадзяюся, вы заплацілі увагу да гэтага. І калі ў вас, то вам прыйдзецца верагодна, зрабілі добра на гэтых двух. Але ад васьмі да мяне, мы на самай справе не код гэта ў класе, але гэта было, зноў жа, спытаў на віктарыне. Так пару рэчаў, каб прыняць Адзначым пры кадаванні ад васьмі да I. Першае, што, за пытанне, быў што вам трэба, каб праверыць, калі радок быў роўны нулю. Пара людзей паспрабавалі праверыць пазней у праграме, калі з кранштэйны я быў - так спецыфіка ў тым, што радок - была роўная нуль. Але памятайце, што нулявы з'яўляецца па сутнасці - гэта добра, каб думаць пра нуль як паказальнік нулявы - паказальнік да нуля - дзесьці ў памяці, дзе Вы ніколі не можаце атрымаць доступ к. Так што, калі нешта роўная нуль, то ведаю, што гэта не быў ініцыялізаваны, ці там нічога няма. Так з з'яўляецца сімвал зоркі, ы Кранштэйны я гэта сімвал. Так што мае сэнс параўноўваць з да нуль, але не з кранштэйны я абнуліць. Але зноў жа - так, каб было першае, што што вы павінны былі зрабіць - праверыць, каб пераканацца, што вы на самай справе атрымалі рэальную радок. Далей, вы хацелі, каб прайсці кожны знак у радку. І так, што б як ёй кранштэйна я, напрыклад, калі я гэта итератор. І лічыць, што характар, і атрымаць яго сапраўднага кошту. Вы яго захоўваецца ў выглядзе гольца, але значэнне ASCII для нуля - нуля як сімвал - на самай справе не цэлы лік нуль. Гэта нейкі іншы нумар, які вы можаце ўбачыць у табліцы ASCII. Так адзін з спосабаў для карэкцыі, што - верагодна, лепшы спосаб для карэкцыі што - гэта адняць з яго значэнне сімвалаў - нуля ў якасці знака. Так мінус адзінарныя двукоссі, нуль, яшчэ адзін сінгл цытата. Гэта зойме яшчэ большая колькасць у вас ёсць як гольца, і атрымаць яго роўным лік у якасці фактычнага колькасці. І гэта вельмі падобна на падыход шмат людзей ўзялі ў Праблема ўсталяваць 2, з Цэзарам і Viginere - тыя шыфры, калі вы былі круцячы іх. Так пасля таго, як яго як лік ад ад нуля да дзевяці, потым - у залежнасці ад куды гэта ідзе ў канчатковым колькасці - вам трэба памножыць яго на ступень 10. Некаторыя людзі пераехалі з спіны, каб спераду, і памножанае асобы лік магутнасцю 10. Некаторыя людзі пераехалі з спераду назад - і так узяў самы высокі замовіць нумары спачатку - і захаваць б тых, хто ў глабальная пераменная лічыльніка. А потым кожны раз праз FOR пятля, памножце гэта гіганцкі глабальны пераменная-лічыльнік на 10, каб зрабіць прастору для наступнага знак. Так, каб было трохі заблытаным без мне пісаць яго на дошцы. Але рашэнне ўзор даступная для вас. Але гэта былі вялікія рэчы мы шукалі. Таксама праверце, каб пераканацца, што кожны індывідуальны характар ​​сапраўды быў характар ​​паміж нулём і дзевяць, і ня нейкі іншы знак, як А, напрыклад. Гэта былі рэчы, якія мы шукалі так як у гэтым пытанні. Я адказаў на ваша пытанне? OMPICA: Так. Джэйсан Хиршхорн: ОК. Ці ёсць іншыя пытанні аб віктарыне 0? А як наконт кампіляцыі? Усе кампіляцыі ці не так? Няма. Былі - [Смяецца] Любыя пытанні аб зборнік працэс? Нічога сабе. [ПАПЕРЫ шолах] Джэйсан Хиршхорн: Так. Майкл. Майкл: Гэта лік 7 - выпадковая? Джэйсан Хиршхорн: нумар 7. Нумар 7 быў атрымаць выпадковае цэлае. Выдатна. Такім чынам, вы далі цэлае а і цэлае б, і вы хочаце выпадковая цэлае паміж а і Ь. Мы можам на самай справе пісаць гэты на дошка, таму што гэты быў адной радкі кода - адзін з спосабаў зрабіць гэта. Такім чынам, мы далі drand як функцыя, якую мы маглі б выкарыстоўваць. І што drand - мяркуючы, што гэта быў пасеяны - што ж drand вярнуцца? Майкл: паплавок паміж 0.0 і 1.0. Джэйсан Хиршхорн: колькасць - так. Лік паміж 0 і 1. І так мы б і. А потым у нас ёсць выпадковы лік паміж 0 і 1, дадзенае нам drand. Некаторыя людзі спрабавалі паставіць б або б мінус , Або што-то ўнутры тых, дужкі. Гэта будзе азначаць, што яны Аргументы гэтай функцыі. drand не прымае ніякіх аргументаў - як GetString робіць ня прымае аргументаў. Так што гэта проста адкрыць дужка, недалёка Хлопец - і што, само па сабе, з'яўляецца выклік функцыі. І гэта дае вам шэраг паміж 0 і 1. Вядома, у нас ёсць цэлы шэраг што лічбы могуць быць цалі Скажам, калі б 10 і складае 5, мы сапраўды хачу шэраг з шэрагам 5. Так што ў наступны, што нам трэба зрабіць, гэта памножыць гэта на дыяпазоне б мінус. Так калі выказаць здагадку, што гэта памножанае. І гэта дасць нам шэраг ў зададзеным дыяпазоне. І, што пэўны дыяпазон, які з'яўляецца Розніца паміж б мінус. І, нарэшце, што буду толькі даць яго з - кажуць дыяпазон паміж б мінус будзе 5, што дасць нам лік ад 0 да 5. Але калі на самай справе 5, нам трэба павысіць гэты дыяпазон да таго, дзе гэта фактычна павінен быць, шляхам дадання. Так што атрымлівае лагічнае права. І потым, вы б іншае пытанне? Майкл: Не. Я проста адчуваю, вельмі дурная прама цяпер. [Смяецца] Джэйсан Хиршхорн: Не. Не адчуваць сябе сапраўды па-дурному. Колькасьць людзей, з усіх сіл з гэтым пытаннем. А потым, іншае пытанне ў тым, drand, Вы сказалі, дае вам паплавок - вяртае лік з якая плавае кропкай. Але гэтая функцыя фактычна папрасіў Для цэлага павінны быць вернутыя. Вам не трэба, каб кінуць гэта відавочна у цэлае, таму што яны аперацыі будуць ставіцца да яго, як і ўсё а плаваць - у выглядзе ліку з якая плавае кропкай. Як гэта будзе - нават калі гэта з'яўляецца цэлым лікам, то гэта памножыць правільна. Усе множанне будзе працаваць. Вам не трэба, каб кінуць яго тут. На самай справе, вы не павінны прывесці яго. Гэта было б - Калі вы пераўтварыць лік вось паміж 0 і 1 - выпадковае лік, з якая плавае кропкай - то гэта будзе толькі 0 або 1 альбо, так Вы страціце ўсе, што дакладнасці. Але ў канцы, калі вы вернецеся, ён аўтаматычна атрымлівае адпраўленыя назад у выглядзе цэлага ліку. Так што вам не трэба рабіць што кастынг сябе. Так што гэта быў адказ на што пытанне, нумар 7. Любыя іншыя пытанні аб віктарыне 0? Так, Эні. Эні: Калі мы выкарыстоўваем рэкурсіўны - калі мы выкарыстоўваем ітэрацыйныя цыклы? Джэйсан Хиршхорн: Калі вы выкарыстоўваеце рэкурсіўная - так больш агульна, плюсы і мінусы рэкурсіі супраць итеративный падыход. Хто-небудзь можа прапанаваць профі або кон? Калі ласка? Не можа ніхто. Хто можа прапанаваць профі або кон? [ПАПЕРЫ шолах] СТУДЭНЦКАЯ 1: рэкурсіўнае менш кадавання - менш набіраць? Джэйсан Хиршхорн: Так наогул, Рэкурсія асабліва, функцыя - або алгарытм, як зліцця роду - якая паддаецца на рэкурсіўны падыход - можа быць больш простым кадзіраваць рэкурсіўна. І гэтак жа, больш сэнсу зрабіць гэта рэкурсіўна. Так што было б пра рэкурсіі. Іншыя? Да? СТУДЭНЦКАЯ 2: Con рэкурсіі - Ён выкарыстоўвае больш памяці. Джэйсан Хиршхорн: Так дакладна. Рэкурсіўная функцыя будзе працягваць дадаваць стэк кадраў у стэк. Так што, калі вы працуеце на шмат колькасці, і павінны называць гэта функцыянаваць шмат, то вы, безумоўна, займаюць больш памяці, у той час як итеративный падыход толькі пакласці адзін стэк кадра ў стэку, таму што ўсё гэта адбываецца ў рамках адной функцыі. Любыя іншыя плюсы і мінусы? Так. СТУДЭНЦКАЯ 3: Плюсы для рэкурсіі. Вы не павінны вызначыць, у загадзя, колькі разоў Код даводзілася паўтараць. Вы можаце мець загадзя пэўную колькасць раз, што ў вас ёсць для перабору, то Рэкурсія лепш, таму што ён прымае гэты вынік. Джэйсан Хиршхорн: Я думаю, што гэта праўда. Але я думаю, у абодвух выпадках Вы б ніколі - вы, верагодна, атрымаць некаторыя ўвод ад карыстальніка. Або гэтая функцыя будзе мець некаторы ўваход што б вызначыць, колькі разоў ён павінен працаваць. Дык увогуле, вы б не жорсткі код - нават у итеративного падыходу - як шмат разоў, што цыкл павінен быць запушчаны. Ці было ў вас іншы, вы былі думаць пра, Эні? ОК. Такім чынам, гэта, бадай, два - самы вялікі за і самы вялікі кон, каб рэкурсіўны супраць итеративный падыход. ОК. Усё астатняе на Quiz 0? Давайце рухацца далей. Выява ўводу / вываду Існуе выдатны кароткая На гэтым тыдні на файл уводу / высновы, што, мы спадзяемся, вы глядзелі кратнае раз, і захапляўся. Шмат працы ўвайшлі ў гэта, і ў мяне ёсць пачуў, што гэта шалёна карысна. Я таксама уключыў спасылку на гэтым слайдзе, у выпадку, калі вы яшчэ не было шанец, каб паглядзець яго ў 10 разоў. Так, мы збіраемся коратка перайсці Асноўныя крокі пры адкрыцці і працы з файламі, а затым мы збіраемся пагрузіцца ў праблемы кадавання да разглядаючы мноства праблем. Такім чынам, яшчэ раз, я збіраюся паставіць гэта на экран, але я буду казаць для ўсяго хвіліну пра тое, што мы тут робіш з файлам I/O-- што гэта значыць? Гэта азначае, што мы можам стварыць наш праграмы, а затым нашы праграмы выхад, а не зрабілі ніякага ўплыву на свет за межамі нашай праграмы. Але калі мы пачынаем працаваць з файламі - як чытаць іх і ствараючы іх - мы можам мець некаторы ўплыў на Свет за межамі нашай праграмы. Гэтак жа, як калі Microsoft Word не змог рабіць якія-небудзь дакументы слова, то раз Microsoft Word кінуць паліць, усе вашы праца будзе пайшоў, і гэта было б сапраўды бескарысна. Мы ў канчатковым рахунку, хочуць, каб мець магчымасць пісаць праграмы, якія могуць паўплываць на Свет вакол іх, як, узяўшы ў складаныя ўваходы - з пункту гледжання файлаў і праз файлы, а таксама ствараць прыгожыя і пераканаўчыя выхады - з пункту гледжання розных тыпаў файлаў. Вось чаму мы пачынаем даведацца, як працаваць з файламі. Больш канкрэтна, што мы робім гэта наступным чынам. Гэта вельмі проста. Ёсць толькі некалькі крокаў, і яны пералічаныя тут, на гэтым кодзе. Так што мы збіраемся прайсці праз гэты код радок за радком. Па-першае, вы бачыце падкрэсліў - калі вы працуеце з файлам, незалежна ад тыпу файла гэта, вам трэба, каб адкрыць яго. І гэта з заклікам FOPEN - прама тут. Вы ўключаюць імя файла. Калі файл не ў каталогу, або тэчка, у якой гэтая праграма жыццё, то вы таксама павінны ўключаць у сябе шлях туды, дзе, што файл з'яўляецца. Мы будзем лічыць, што гэта файл з імем "text.txt" - просты тэкставы дакумент - гэта ў жа тэчцы, гэтай праграмы з'яўляецца. Дык вось іншая справа мець на розум - што калі вы хочаце, каб адкрыць файл дзесьці ў іншым месцы, вы на самой справе трэба ўключыць яго месцазнаходжанне. Па-другое, вы можаце перадаць аргумент у Еореп, і вось, што вы хочаце зрабіць з файлам. Ёсць тры асноўных аргументу, што Вы збіраецеся перайсці на Еореп. Хто можа даць мне гэтыя тры? Хто можа даць мне адзін з іх? Так. СТУДЭНЦКАЯ 4: Імя файла? Джэйсан Хиршхорн: Выбачайце. Тры асноўных аргументу можна перадаць як другі аргумент Еореп. Вы маеце рацыю - імя файла з'яўляецца першым аргументам. Але другі аргумент Еореп з'яўляюцца як правіла, тры струны, і - так. Алея. ALEJA: для дадання. Джэйсан Хиршхорн:, калі вы хочаце дадаць у файл, які ўжо існуе. СТУДЭНЦКАЯ 5: R для чытання. Джэйсан Хиршхорн: R, калі вы хочаце чытаць з файла. СТУДЭНЦКАЯ 6: Вт для запісу. Джэйсан Хиршхорн: А ж, калі вы хочаце напісаць у файл. Такім чынам, у гэтым выпадку, мы пішам ў файл, таму мы павінны ш. Вы адкрываеце яго, вы таксама павінны захаваць файл дзе-небудзь, а вось з код з левага боку аператар прысвойвання - Я ствараю паказальнік на файл называецца, у дадзеным выпадку, файл. Мы не збіраемся турбавацца, што гэта ўсё загалоўныя Файлаў рэч. Дастаткова сказаць,, гэта доўгі паток нулёў і адзінак. І вось як мы збіраемся кіраваць ім і зразумець яго. Наступнае, што нам трэба зрабіць, - і Гэта неверагодна важна - кожны раз, калі вы адкрываеце файл - на самай справе, кожны раз, калі вы тэлефануеце Таноса, для Напрыклад, каб атрымаць некаторы колькасць памяці і паспрабуйце і захаваць яго ў паказальнік, вы заўсёды хочаце праверыць, каб пераканацца, што гэта Функцыя не вярнуўся пустым. Такім чынам, у гэтым выпадку, мы правяраем, каб зрабіць упэўнены, што мы на самай справе адкрыў падаць правільна, і было няма памылкі ў нашай праграме. Далей, як толькі мы праверылі, каб пераканацца, што ў нас ёсць працоўны файл, мы можам напішыце, або чытанне з ці дадаць у файл. У гэтым выпадку, я проста друку адна лінія у гэты файл. Як я даведаюся, што? Ну, я выкарыстоўваю гэтую функцыю называецца fprintf. Усе функцыі вы будзеце выкарыстоўваць пры напісанні або чытанні з або кіравання файламі будзе падобны на функцыі вы бачылі раней, але пачынаюцца з літары F, стоячы для файла. І fprintf, у адрозненне ад нашай звычайнай друку дадатак, займае адзін дадатковы аргумент, і што гэта файл, дзе вы хочаце надрукаваць гэты радок. У мяне няма нічога, каб права Ohai. Я не маю траціну аргумент Е - ці другі аргумент Е, Трэці аргумент fprintf, таму што я не маюць ніякіх запаўняльнікі тут. Я не уключаючы любыя зменныя. Але, зноў жа, fprintf і ўсе гэтыя файле функцыі, якія працуюць з файламі , Як правіла, збіраецца патрэбен файл на якой яны працуюць. Нарэшце, апошняя важная рэч, каб зрабіць, гэта зачыніць файл, гэтак жа, як з - кожны раз, калі мы Malloc нешта, мы хочам вызваліць нешта, каб не мае месца ўцечка памяці - мы хочам , Каб закрыць наш файл. Калі гэтая праграма выйшла без закрыцця файл, шанцы нічога не пойдзе не так, асабліва, калі гэта быў невялікі файл. Але гэта, вядома, добры стыль кадавання і на практыцы заўсёды зачыняць файл калі вы скончыце яго выкарыстання. Так што гэта асновы файлавага ўводу / O. Вы, напэўна, бачылі, што і раней, або глядзеў яго ў гэтым фантастычным кароткага замыкання. Хто-небудзь ёсць якія-небудзь пытанні, перш чым мы ідзем у некаторай практыкі кадавання праблемы, аб файле ўводу / вываду ці крокі, якія я проста падышоў? [Машынцы ГУК] Джэйсан Хиршхорн: Ці падабаецца вам ёсць пытанне, AVI? AVI: Не. Джэйсан Хиршхорн: ОК. Я збіраюся пачакаць яшчэ сем секунд. [Смяецца] Гэта сапраўды добры савет. Вы, хлопцы, проста не падабаецца задаваць пытанні. Гэта нармальна. ОК. Такім чынам, наша першая задача практыка, мы збіраецца дубляваць функцыю інструмент каманднага радка, што вы, верагодна, выкарыстоўваецца перш за - копіі - інструмент капіявання. Калі вы ўведзяце ф а затым перадаць яго два Аргументы ў вашым тэрмінале, вы можаце скапіяваць файл. І гэта тое, што мы збіраемся напісаць прама цяпер. Такім чынам, яшчэ раз, чытаючы прэч гэтым слайдзе, я б Вам напісаць праграму, якая прымае два і толькі два з каманднага радка Аргументы - Зыходны файл і файл прызначэння - і капіюе змесціва крыніцы файл у файл прызначэння адзін байт за адзін раз. Так што вельмі шмат для высвятлення. Зноў жа, добры падыход да гэтай мэты з'яўляецца не ідуць прама ў кодзе C, але разбіць яго на некалькі крокаў. Па-першае, думаць аб логіцы - дакладна тое, што я прашу вас зрабіць - і зразумець усе крокі да вырашэння гэтай праблемы. Не ў З, проста ў нейкі псевдокоде, ці нават ментальная мадэль што адбываецца. Далей, калі ў вас ёсць псевдокод ўніз, высветліць, як псевдокод адлюстроўваецца на прылады і рэчаў, якія мы навучыліся выкарыстоўваць у C. І, нарэшце, калі ў вас ёсць усё, што разам, вы можаце напісаць праблему. Вазьміце 5 да 10 хвілін, каб працаваць над гэтай праблемай. Я пакладу інструкцыям назад у секунду. А потым мы збіраемся перайсці псевдокод, і код гэта жыць як група. Калі ў вас узніклі пытанні, пакуль вы працуем над гэтым, не саромейцеся, каб падняць ваша рука, і я прыйду вакол і адказаць на іх. СТУДЭНЦКАЯ 7: Ці магу я правядзіце паперка? Джэйсан Хиршхорн: У чым справа? [Машынцы ГУК] Джэйсан Хиршхорн: ОК. Давайце разгледзім псевдокоде першым, і тады я дам табе яшчэ пару хвілін, каб скончыць кадавання. Хто хацеў бы пачаць мяне з першай радку псевдокод для гэтай функцыі? СТУДЭНЦКАЯ 8: Пераканайцеся, што Вам далі два файла. Джэйсан Хиршхорн: ОК. І калі мы не будзем? СТУДЭНЦКАЯ 8: я вярнуся 0. Джэйсан Хиршхорн: Ці павінны мы вярнуць 0? СТУДЭНЦКАЯ 8: Вяртанне - гашэння. Выбачайце. Джэйсан Хиршхорн: Так. Напэўна, няма 0. Таму 0 азначае, што ўсё было добра. ОК. Дык вось першая лінія псевдокода. Хто мае другую лінію псевдокоде? СТУДЭНЦКАЯ 9: Адкрыць абедзве файлы? Джэйсан Хиршхорн: Адкрыйце абодва файла. ОК? СТУДЭНЦКАЯ 10: Праверце, калі файл NULL? Джэйсан Хиршхорн: Праверце, упэўнены ні адзін не NULL. Як у баку - слэш 0 - з'яўляецца тое, што NULL? СТУДЭНЦКАЯ 11: Не. Джэйсан Хиршхорн: Гэта не NULL. Гэта называецца NULL тэрмінатар. Гэта на самай справе пішацца толькі з адной л. Так праверка нешта супраць, што - што на самой справе персанаж - таму праверка нешта супраць, што не тое ж самае, як правяраць, калі гэта роўна NULL. І некаторыя людзі - на іх віктарынах і іх праблемы наборы - атрымалі два з іх блытаюць. Але два з іх з'яўляюцца на самай справе іншы. Адзін сканчаецца радок - адзін з'яўляецца паказальнікам на 0. СТУДЭНЦКАЯ 12: Чаму б вам не праверыць, пераканайцеся, што файлы не NULL перш чым адкрыць іх? Джэйсан Хиршхорн: Так адкрытым эканоміць нешта ў гэтым файле. І калі вы ідзяце сюды - так гэтая лінія - Еореп - дасць вам адрас і крама што адрас у файле, калі ён працуе. Калі ён не працуе, ён будзе захоўваць NULL - СТУДЭНЦКАЯ 12: Ох. ОК. Трапіўся. Джэйсан Хиршхорн: У файле. Такім чынам, вы не можаце праверыць на NULL да таго як вы адкрылі іх. NULL азначае нешта не зрабіў працаваць няправільна. ОК. Таму праверыць, каб пераканацца, ні ёсць? Або? Што мы думаем? Мы будзем ісці з гэтым. СТУДЭНЦКАЯ 13: Ці з'яўляецца. Джэйсан Хиршхорн: Ці з'яўляецца? Ні адзін не? СТУДЭНЦКАЯ 13: Ці з'яўляецца. Джэйсан Хиршхорн: ОК. Мы, здаецца, ёсць некаторыя кансенсус па гэтым пытанні. Ні адзін не NULL. Добра, наступная радок псевдокода. Хто не даў мне лінію яшчэ? Мы будзем чакаць вас. Так. СТУДЭНЦКАЯ 14: Вы павінны прачытаць з першага файла? Джэйсан Хиршхорн: ОК. СТУДЭНЦКАЯ 14: Ці мы выкарыстоўваем fscanf або нешта накшталт гэтага першага файла? Джэйсан Хиршхорн: Таму мы хочам чытаць з першага файла і - давайце, што прама тут. Чытанне з зыходнага файла. І потым, што ж нам рабіць пасля таго як мы чытанне з файла? Хто-то яшчэ? СТУДЭНЦКАЯ 15: Напісаць у канчатковы файл? Джэйсан Хиршхорн: Мы пішам, каб канчатковы файл, і - ОК. Што яшчэ нам не хапае? Кто-то, хто не даў мне радок кода яшчэ - псевдокода. Так. СТУДЭНЦКАЯ 16: Можа быць, вы заўсёды можаце праверыць ці ёсць нешта, каб чытаць для, як у наступным радку? Гэта, як у наступным радку, ўбачыць, калі ён існуе. [Электронны гукавы сігнал] Джэйсан Хиршхорн: Ой. Гэта мая журналявання праграмнага забеспячэння. Да? СТУДЭНЦКАЯ 16: Так. Джэйсан Хиршхорн: Так дайце ён мне яшчэ адзін раз. СТУДЭНЦКАЯ 16: Праверце, ці правільна там яшчэ наступная радок з Зыходны файл для чытання. Джэйсан Хиршхорн: ОК. Такім чынам, мы не чытае радкі - чыталі байт тут - але вы маеце рацыю. Мы хочам, каб чытаць і пісаць, пакуль няма больш байт. ОК. І такім чынам, яны павінны быць сапраўды водступам трохі, таму што яны пад там. Ці не так? Пакуль мы не знаходзіцеся па-за байт, мы збіраемся чытанне з файла і пісаць у файл прызначэння. І потым, што гэта апошні лінія псевдокоде? Той, хто не дадзена мне нешта яшчэ. СТУДЭНЦКАЯ 17: Зачыніце файлы? Джэйсан Хиршхорн: Цалкам дакладна. Зачыніце файлы. Так што наш псевдокод. Я збіраюся паставіць псевдокод ў Gedit, і праз пару хвілін мы будзе кадзіраваць гэта разам. ОК. Давайце пачаць працу ў якасці групы. Nishant, у мяне ёсць новы файл. Я толькі што адкрыў гэта. Без назвы дакумента 1. Што першае, што я павінен рабіць? Nishant: Уключыце бібліятэкі? Джэйсан Хиршхорн: ОК. Якія бібліятэкі? Nishant: stdio.h, stdlib.h, я веру? Джэйсан Хиршхорн: ОК. Што такое stdlib для? Nishant: Я забыўся. Джэйсан Хиршхорн: ОК. Так ўключаюць STDIO. Што рабіць, яшчэ да Я пачынаю кадавання? Nishant: Напісаць загаловак? Джэйсан Хиршхорн: Як я атрымліваю гэта каляровы? [Устаўляючы ГАЛАСЫ] Nishant: Як вы атрымліваеце гэта колеры? Джэйсан Хиршхорн: Як я каляровае кадаваньне? Nishant: Я не ведаю. О. Захаваць. Джэйсан Хиршхорн: Save. Так. Я павінен захаваць яго як. С. Так захавайце яго на працоўным стале як cp.c. Салодкі. І калі я хачу, каб атрымаць поўную стыль кропкі, што я павінен ўключаюць у верхняй? Nishant: Вы маглі б напісаць сваё імя, імя праграмы, і ў мэтах праграмы, а? Джэйсан Хиршхорн: Выглядае добра. Выдатна. Такім чынам, вы пачалі нас выдатна. # Уключыць - мы таксама напісаць - ОК. Так што я думаю, што я ўсё гатова да працы. Хто мае першую радок кода для мяне - або першыя радкі кода, спатрэбіцца, каб задаволіць наш першы каментаваць псевдокоде? Вы. СТУДЭНЦКАЯ 18: яна не павінна быць унутр агдс, а затым сімвал * агду? Джэйсан Хиршхорн: Я думаю, вы маеце рацыю. Давайце зменім гэта ў цэлае асноўныя, адкрытыя дужка, унутр агдс, коска, сімвал * агду? Як гэта? СТУДЭНЦКАЯ 18: Кранштэйны. Джэйсан Хиршхорн: Кранштэйны. Адкрыць кранштэйны, якая зачыняе дужка, блізка бацькоў. Выдатна. Цяпер я магу ўзяць аргументы каманднага радка. ОК. Пераканайцеся, нам даюць два файла. Вы можаце даць мне, што добра. СТУДЭНЦКАЯ 18: Калі агдс - на гэты раз не раўняцца 3. Джэйсан Хиршхорн: Калі адкрытыя дужка агдс ня роўная 3? СТУДЭНЦКАЯ 18: Так, вы вернецеся 1 або што-небудзь. Джэйсан Хиршхорн: Выбачайце. СТУДЭНЦКАЯ 18: Вяртанне 1 або што-небудзь. Джэйсан Хиршхорн: Вяртанне 1. ОК? Вялікі. Адкрыйце абодва файла. Хто можа дапамагчы мне адкрыць абодва файла? Хто не даў мне код яшчэ? Курт? Курт: Так усё загалоўныя F-I-L-E зоркі-крыніцы. Джэйсан Хиршхорн: Я збіраюся выняць галосныя. Тыя, гэта крута. Гэта як Tumblr. СТУДЭНЦКАЯ 18: Роўна FOPEN - Джэйсан Хиршхорн: Роўна FOPEN? СТУДЭНЦКАЯ 18: Адкрытыя дужка, агду, якая адкрывае дужка. Джэйсан Хиршхорн: Пачакайце. Выбачайце. Адкрыць дужка. ОК. СТУДЭНЦКАЯ 18: Так. Argv 1 да поўдня. Джэйсан Хиршхорн: Sub 1? СТУДЭНЦКАЯ 18: Так. Argv якая адкрывае дужка 1 - Так. А потым коска, а затым адкрыты двайны цытата, г, падвойныя двукоссі, блізкія дужка, кропка з коскі. Джэйсан Хиршхорн: Салодкі. А як наконт другога? СТУДЭНЦКАЯ 18: Вельмі падобна, але замест з S-R-C, вы б назваў гэта D-S-Т. Джэйсан Хиршхорн: Оо! Мне гэта падабаецца. СТУДЭНЦКАЯ 18: Проста D-S-Т. Так. А потым ARGV, адкрыты кранштэйны, 2. Так. І тое ш замест р. Так. Джэйсан Хиршхорн: Выдатна. Наступная пара радкоў. Акрамя таго, калі ў кагосьці ёсць рэчы, каб дадаць да лініі, якія мы зрабілі, не саромейцеся дадаць і іх. Пераканайцеся ў тым, ні на ёсць NULL. Хто можа даць мне код, мне трэба, каб задаволіць гэтую лінію псевдокоде? Арчер. ARCHER: Калі ўражаннямі роўная роўных NULL або DST складае роўных NULL, то вы вернецеся - Джэйсан Хиршхорн: Што? ARCHER: Return 2? Джэйсан Хиршхорн: Return 2. Так што, калі адкрыта дужка ўражаннямі роўна роўна NULL, або - што б гэта ні thing's - труба? Труба? Мы будзем называць яго трубы. Труба, трубы, DST складае роўных NULL, вярнуцца 2. ОК? Пакуль мы не знаходзіцеся па-за байт - мы накшталт прапусціў гэты крок з псевдокод частка ісці, каб тут. Але пакуль мы не з байт - што гэта падобна? Які выгляд C структуры - але я не выкарыстоўваю структуру слова, таму што мы збіраемся, каб пачаць выкарыстоўваць што ў іншых выпадках - але З інструментам гэта гучыць як? СТУДЭНЦКАЯ 19: пятля. Джэйсан Хиршхорн: пятля. Гучыць як завесы. Дык хто можа даць мне першы радок кода завесы прама тут? Вы можаце таксама выбраць, якія цыкл вы хочаце, калі вы дасце мне гэты радок кода. Ёсць тры віды. Вы дабіраецеся, каб абраць. Я хацеў бы прапанаваць адзін з іх. Аві. Які з іх вы хочаце? AVI: ДЛЯ. Джэйсан Хиршхорн: ДЛЯ. AVI: Int я роўная нуля. Джэйсан Хиршхорн: ОК. AVI: Гэтая частка я не ўпэўнены, а. Але я менш памеру крыніцы зоркі? Я не ўпэўнены ў гэтым. Джэйсан Хиршхорн: ОК. AVI: Таму што вы хочаце памер файла, ці не так? Джэйсан Хиршхорн: Так што гэта, верагодна, не будзе даць нам памер фактычная файла ў байтах. Так, што яшчэ мы маглі зрабіць? Што гэта іншы тып цыкла? Ці мы павінны прытрымлівацца пятля для? СТУДЭНЦКАЯ 20: Не маглі б вы зрабіць той час як цыкл? І потым, што вы хацелі зрабіць, гэта you'd - таму што ў нас з * для файла. Так што, калі мы проста працягваем павялічваючы, што пакуль мы не знайшлі б нулявога знака ў канец яго? Або няма, у тым, што не так, як працуюць файлы? Джэйсан Хиршхорн: Так мы можам трымаць павялічваючы сімвал * пакуль мы не знойдзем NULL - СТУДЭНЦКАЯ 20: Па сутнасці працягваць посимвольно, пакуль мы патрапілі канца файла. Джэйсан Хиршхорн: Так. Дык вось што мы хочам зрабіць. Мы хочам, каб чытаць, характар па характары, пакуль мы не дабяромся да канца файла. СТУДЭНЦКАЯ 20: Так. Знайсці - што гэта канец або знак прыпынку ў канцы тэкставага файла. Джэйсан Хиршхорн: ОК. Таму, калі мы дабіраемся да канца файла - адкуль мы ведаем, што мы дасягнулі канец файла? Калі я тэлефаную - так што давайце крок назад. Што такое функцыя? Пойдзем у гэтай лініі прама тут. Чытанне з зыходнага файла. Хто можа даць мне гэты радок кода? СТУДЭНЦКАЯ 21: Fscanf? Джэйсан Хиршхорн: Fscanf. ОК. Што рабіць, калі я хачу чытаць, вельмі У прыватнасці, адзін байт? СТУДЭНЦКАЯ 21: Я не ведаю. Джэйсан Хиршхорн: ОК. Нават прасцей, чым fscanf - што гэта - Я хачу прачытаць з зыходнага файла? Чытанне з зыходнага файла. Што такое функцыя - так. СТУДЭНЦКАЯ 22: Гэта FREAD? Джэйсан Хиршхорн: FREAD. Я думаю, давайце прытрымлівацца што адзін на дадзены момант. Якія аргументы робіць FREAD ўзяць? СТУДЭНЦКАЯ 22: Верагодна, тып файла, а затым размяшчэнне ў файле? Джэйсан Хиршхорн: Што я магу ўвесці тут каб высветліць, які тып аргументаў FREAD прымае? НЕКАЛЬКІ СТУДЭНТЫ: чалавек FREAD. Джэйсан Хиршхорн: Чалавек FREAD і FWRITE. Падобна на тое, яны боўтацца разам. Так FREAD займае, як шмат аргументаў? СТУДЭНЦКАЯ 23: Чатыры. Джэйсан Хиршхорн: яна займае чатыры аргументу. Ён прымае паказальнік, памер, і што рэч, што дзіўна, а некаторыя файл. ОК? Давайце прачытаем пра гэта прама тут. "Функцыя FREAD чытае н кар элементы дадзеных, кожны байт памер доўга, з патоку, на які паказвае паток, захоўваючы іх на месцы даецца паказальнік ". Так чатыры аргументу. Чаму б мне не проста скапіяваць гэта, і ўстаўце яго прама тут. ОК. Дык хто ж можа пачаць запаўненне гэтыя аргументы для мяне? Аві. AVI: Выміце пустэчу. Пакладзеце толькі SRC. Выміце ўказальнік і зорку. Пакладзеце SRC. Тады - Джэйсан Хиршхорн: Так што я збіраюся спыніць Вы там, таму што гэта няправільна. Вы маеце рацыю з SRC, але дзе Знаходжанне павінны пайсці? [Устаўляючы ГАЛАСЫ] Джэйсан Хиршхорн: Ён павінен ісці сюды. Гэта ўражаннямі - наш ўражаннямі тып. Давайце паглядзім тут. Гэта просіць тып файла *, мы на самай справе, як правіла, убачыць іх так. Так што гэта просіць аргументам тып файла * пад назвай паток, які ўражаннямі. ОК? Які памер рэчы рабіць мы хочам чытаць? Я даў табе гэта ў апісанне праблемы. СТУДЭНЦКАЯ 24: Адзін байт за адзін раз. Джэйсан Хиршхорн: Адзін байт. Наколькі вялікая байт? Яго памер у байтах, таму тое, што я магу паставіць прама там? СТУДЭНЦКАЯ 25: Адзін. Джэйсан Хиршхорн: Адзін. Дакладна. Яе памер складае ў адзінку байта, так 1 СТУДЗЕНЯ байт. Колькі я хачу, каб прачытаць за адзін раз. СТУДЭНЦКАЯ 26: Адзін? Джэйсан Хиршхорн: Адна рэч. Я хачу прачытаць адно з памеру 1, адзін укус за адзін раз. І дзе я магу паставіць яго, як толькі я прачытаў гэта? СТУДЭНЦКАЯ 27: Пункт прызначэння? Джэйсан Хиршхорн: Так я не магу паставіць гэта проста ў месца прызначэння. СТУДЭНЦКАЯ 28: Ты збіраешся пакласці гэта ў трэці паказальнік? СТУДЭНЦКАЯ 27: Для прызначэння. Джэйсан Хиршхорн: ОК. Так. СТУДЭНЦКАЯ 29: Вы можаце абвясціць нешта дзейнічаць як часовае захоўванне раней. Джэйсан Хиршхорн: ОК. Дай мне гэта. СТУДЭНЦКАЯ 29: Яшчэ адзін файл паказальнік, можа быць? Джэйсан Хиршхорн: ОК. Так што гэта пустата зорка - гэта тып несапраўднымі зорка, так што гэта не павінны быць паказальнікам файла. І калі я чытаю адзін байт, дзе б добрае месца захоўваць адзін байт? СТУДЭНЦКАЯ 29: масіў? Джэйсан Хиршхорн: масіў. ОК. І, што яшчэ нешта, што гэта проста памер адзін байт? СТУДЭНЦКАЯ 30: знак *? СТУДЭНЦКАЯ 29: Так. Джэйсан Хиршхорн: знак * не адзін байт. СТУДЭНЦКАЯ 29: знак. Джэйсан Хиршхорн: знак займае адзін байт. Ці не так? Так што давайце называць гэты буфер з'яўляецца агульным імя, якое выкарыстоўваецца для гэтых рэчаў для захоўвання нешта часова. Так што я стварыць буфер. Ці не так? Але для гэтага трэба пустэчу *. Таму, магчыма, вы маеце рацыю, што гэта павінен быць буфер памерам 0. Так ён захоўвае адзін - Права. Таму што гэта прама тут - сімвал буфер характар, але гэта займае пустэчу * - паказальнік. Так што я мог бы зрабіць гэта і цяпер Буфер з'яўляецца паказальнікам. Што яшчэ я мог зрабіць? СТУДЭНЦКАЯ 31: Пакладзеце зорку наступны на персанаж. Джэйсан Хиршхорн: я мог стварылі гэта сімвал *. ОК. Што яшчэ я мог зрабіць? Або пойдзем з гэтым. Чар * буфер, так што я магу перавесці сюды? СТУДЭНЦКАЯ 31: Буфер. Джэйсан Хиршхорн: Буфер. Буфер з'яўляецца паказальнікам на знак. І ў гэтым месцы, мы змяшчаем адзін байт тое, што мы чыталі. Так. Аві. AVI: Проста хуткі пытанне. Хочаце Malloc буфер? Джэйсан Хиршхорн: Хто можа адказаць на гэтае пытанне? СТУДЭНЦКАЯ 32: Ну, гэта на самай справе не кропка да чаго прама цяпер, так - Джэйсан Хиршхорн: Але рабіць мы хочам Malloc гэта? СТУДЭНЦКАЯ 32: Калі вы павінны былі зрабіць яго, што спосаб, я думаю, так, таму што вы павінны былі б некаторы месца для таго, каб паказаць на. Джэйсан Хиршхорн: Ці ёсць у нас павінны Malloc гэта? СТУДЭНЦКАЯ 33: Калі вы збіраецеся выкарыстоўваць яго па-за цыклу. Джэйсан Хиршхорн: Мы збіраемся выкарыстоўваць яго па-за цыкла? СТУДЭНЦКАЯ 34: Так. СТУДЭНЦКАЯ 35: Пачакайце. Ці хочам мы аб'явім яго ў пятлі ў тагасветным? Джэйсан Хиршхорн: Так што я думаю, мы павінны некаторыя псеўда той час як цыкл тут, што мы спрабуючы высветліць, што мы яшчэ не дайшлі да яшчэ. Нам не трэба, каб Malloc яго. Мы працуе ў асноўным гэта толькі збіраецца для выкарыстання ўнутры гэтай завесы. Гэта не павінны існаваць па-за гэтага. Так, гэта можа быць лакальная пераменная. У вас ёсць паказальнік на лакальная пераменная. СТУДЭНЦКАЯ 36: Але гэта не паказваючы ні да чаго. Джэйсан Хиршхорн: Не, гэта не ініцыялізацыі ні да чаго. Але мы не збіраемся выкарыстоўваць яго таксама. Мы збіраемся, каб пакласці што-то ў гэта ў першы раз мы яе выкарыстоўваем. Так што, здаецца, у парадку. Такім чынам, мы не павінны Таноса тут. І я думаю, гэта нармальна, як ёсць. ОК. У нас ёсць FREAD лінію. Давайце зробім наступную радок. Калі мы хочам, каб запісаць у файл, што добрая функцыя выкарыстоўваць, каб зрабіць гэта? СТУДЭНЦКАЯ 37: FWRITE? СТУДЭНЦКАЯ 38: Fprintf? Джэйсан Хиршхорн: Fprintf з'яўляецца адным. Што яшчэ адзін? СТУДЭНЦКАЯ 39: FWRITE. Джэйсан Хиршхорн: FWRITE. І для нашых мэтаў, FWRITE, якія мы бачылі тут, верагодна, лепшы выбар. Ён прымае чатыры аргументу, а таксама. Nishant, вы можаце даць мне аргументы? Nishant: першая адбываецца быць проста буфер. Джэйсан Хиршхорн: ОК. Nishant: Другі'S проста будзе 1. Па-трэцяе адзін будзе 1. І чацвёрты будзе DST. Джэйсан Хиршхорн: Хто-небудзь ёсць ўсе пытанні аб той лініі? Гэта выглядае добра. ОК. Так што цяпер гэта выглядае як адно мы знаходзімся адсутнічае - на самай справе, давайце напішам гэта апошняя радок. Зачыніце файлы. Хто можа скончыць нас пісаць гэтыя апошнія два радкі? Так. На жаль, як цябе завуць? Люсі: Люсі. Джэйсан Хиршхорн: Люсі. Люсі: Fclose ўражаннямі, а затым FClose прызначэння. Джэйсан Хиршхорн: Fclose, адкрытая дужка, Першапачаткова, блізкія дужка, кропка з коскі. І FClose - так? Люсі: Адкрыць дужкі, DST а затым з коскі. Джэйсан Хиршхорн: Выдатна. І што я павінен ўключыць у канцы? Люсі: Вяртае 0. Джэйсан Хиршхорн: Вяртае 0. Ці павінен я? Проста пытанне. Ці ёсць у нас ўключыць вяртанне 0? НЕКАЛЬКІ СТУДЭНТЫ: Не. Джэйсан Хиршхорн: Не. Галоўная робіць гэта аўтаматычна калі вы дойдзе да канца. Але я думаю, гэта добра, калі ўключыць яго ў відавочным выглядзе. Асабліва, калі мы вяртаемся да аднаго рэчы працягу ўсёй праграмы. ОК. Гэта тое, што нам не хапае - А тое, што? Хто можа думаць аб некаторых - мае некаторы сэнс, якія рэчы можа пайсці туды? Нават калі гэта ўсяго толькі ў некаторым псевдокоде як і мову? Што мы на самай справе - тое, што мы хочам, каб ісці да? Так, Люсі. Люсі: канец файла. Джэйсан Хиршхорн: канец файла. Так што вы разумееце пад канец файла? Люсі: Як толькі вы дасягаеце канец файла, спыніцца. Джэйсан Хиршхорн: ОК. Таму, як толькі мы дасягнем канца файла. Як мы ведаем, калі мы дасягнулі канец файла? СТУДЭНЦКАЯ 40: Я думаю, што буфер будзе ўстаноўлены ў NULL. СТУДЭНЦКАЯ 41: Буфер абвешчаны ўнутры цыклу. Джэйсан Хиршхорн: Дык вы думаеце, буфер будзе ўстаноўлены ў NULL. Навошта буфер быць усталяваны ў NULL? СТУДЭНЦКАЯ 40: Таму што, калі вы FREAD, вы спрабуеце паставіць нічога ў буфер. Джэйсан Хиршхорн: ОК. Так што вы думаеце FREAD - калі мы дасягнулі канца файл, што FREAD збіраецеся рабіць? Я думаю, што гэта пытанне мы павінны высветліць. Што FREAD рабіць? Ці значыць гэта паставіць NULL ў буферы, або ён робіць нешта яшчэ? Як мы можам зразумець, што гэта? СТУДЭНЦКАЯ 42: Чалавек. Джэйсан Хиршхорн: Чалавек. Такім чынам, давайце паглядзім тут. Вярнуцца значэнне. У выпадку поспеху FREAD і FWRITE вярнуцца колькасць элементаў прачытаныя або запісаныя. Гэты лік роўна колькасці байт перадаюцца толькі пры памер 1. Калі адбываецца памылка, або ў канцы файл будзе дасягнута, вяртаецца значэнне Кароткая колькасць элементаў або 0. Так што для нашых мэтаў, калі FREAD дасягае канец файла, і счытвае з канец файла, там нічога не засталося чытаць, што ён збіраецца вярнуцца? СТУДЭНЦКАЯ 43: Нулявая? Джэйсан Хиршхорн: Што? СТУДЭНЦКАЯ 43: Нулявая? Джэйсан Хиршхорн: Нуль. Гэта збіраецца вярнуць нуль. Такім чынам, мы ведаем, што FREAD, калі мы дасягнулі канца файла, збіраецца вярнуцца да нуля. Як мы можам выкарыстоўваць гэта ў нашых інтарэсах? AVI: Вы можаце абвясціць зменную за межамі завесы пад назвай праверка. Калі праверка роўна - на дадзены момант - адзін. Джэйсан Хиршхорн: ОК. AVI: І тады вы можаце пакласці IF заяву адразу пасля FREAD кажучы, калі FREAD роўная нуля - няма. Джэйсан Хиршхорн: Хто можа дапамагчы Аві па-за домам? AVI: Што такое значэнне які вяртаецца FREAD? Джэйсан Хиршхорн: Мы проста пайшоў з гэтай нагоды. AVI: Як вы ўяўляеце гэта? Джэйсан Хиршхорн: Так яна вяртае - давайце паглядзець тут - яна вяртае size_t, які з'яўляецца па сутнасці цэлым лікам. Так што вяртае цэлае. А ў нашым выпадку, гэта будзе вяртае 1 або 0 - 1, калі ён чытаў адно - адзін байт, і 0, калі мы дайшлі да канца. Так што калі FREAD - так? СТУДЭНЦКАЯ 45: А вы не можаце проста пакласці ў поўнай FREAD (буфер, 1, 1, SRC) у у той час як цыкл? Джэйсан Хиршхорн: Дык вы прапануеце Робячы гэта ў там? [Устаўляючы ГАЛАСЫ] Джэйсан Хиршхорн: Пачакай. Такім чынам, мы збавення гэтага. Дык вы прапануеце пакласці FREAD ў там? Што мы павінны таксама рухацца калі вы хочаце зрабіць? СТУДЭНЦКАЯ 45: Буфер звонку. Джэйсан Хиршхорн: Мы павінны таксама рухацца ў гэтым тут. СТУДЭНЦКАЯ 45: Але робіць гэта ўвесь час перамясціць яго наперад? [Устаўляючы ГАЛАСЫ] Джэйсан Хиршхорн: ОК. Дык вось што прапанаваў Okshar. Мы ствараем наш буфер. Мы ПАКУЛЬ FREAD, то мы FWRITE. Думкі з гэтай нагоды? СТУДЭНЦКАЯ 46: Мой адзіны пытанне, будзе ён на самай справе выканаць каманду FREAD? Джэйсан Хиршхорн: Добры пытанне. Калі вы кладзе выклік функцыі ўнутры стану, робіць гэта выклік функцыі выконваць? Мы бачылі прыклады гэтага раней. Ці не так? СТУДЭНЦКАЯ 46: ОК. Так. Так ён робіць выканаць. Джэйсан Хиршхорн: Мы бачылі рэчы ні раней, дзе ў нас ёсць Выклік функцыі ўнутры ўмовы. Ці выканаць, што выклік функцыі? Так. Такім чынам, адказ будзе станоўчым. Выклік гэтай функцыі будзе выконваць. Але зноў жа, гэта тое, што мы хочам? Што з'яўляецца адным са спосабаў мы маглі зразумець , Калі гэта тое, што мы хочам? НЕКАЛЬКІ СТУДЭНТЫ: Запусціце яго? Джэйсан Хиршхорн: Мы маглі б запусціць яго. Але перш чым мы гэта зробім, мы маглі таксама разважаць праз гэта. Калі - у нас ёсць адзін байт ў нашым файл, мы вернемся да тут, мы вернемся да гэтага коду. Гэта будзе працаваць. FREAD вернецца адзін байт і захоўваеце яго ў буферы. І гэта будзе ацаніць у 1, Добра, пасля таго як ён вяртае 1. Такім чынам, хоць 1. Ці азначае гэта, код ўнутры той час як цыкл будзе выконвацца? СТУДЭНЦКАЯ 47: Так. Гэта праўда. Джэйсан Хиршхорн: Так. 1 дакладна. Гэта не 0. Такім чынам, код ўнутры тут будзе выконваць. Таму мы будзем пісаць, што. Мы будзем рухацца да гэтай лінія яшчэ раз. Цяпер у нас ёсць - мы ў канцы нашага файла. Мы чытаем з канца нашага файла, , Таму што мы толькі адзін байт ў ім. FREAD вяртае 0, крамы нешта ў буферы. Я шчыра не ведаю, што ён захоўвае ў буферы. Мы маглі б, верагодна, шукаць каб убачыць, што ён робіць. Тое, што я шчыра не ведаю. Мы не ведаем, каго гэта хвалюе тое, што ён захоўвае ў буферы? Але гэта вяртае 0. І будзе ў той час як 0 выканаць? ПАКУЛЬ 0 не будуць выконвацца. Так тады мы будзем рухацца ўніз тут. Так што давайце ўзняццем рук, калі гэта гэта код, мы павінны працаваць, або калі мы павінны зрабіць змены ў першую чаргу. Так што калі вы думаеце, - у вас ёсць, каб галасаваць. Калі вы думаеце, мы павінны запусціць гэты код як ёсць, калі ласка, падніміце руку. ОК. Там адна - ў вас ёсць пытанне, неспакой? Так. СТУДЭНЦКАЯ 48: Пасля таго як мы рухацца буфер па-за цыкла, мы павінны Malloc гэта? Джэйсан Хиршхорн: Добры пытанне. Пасля таго як мы рухацца буфер межамі цыкл, мы павінны Malloc гэта? Гэта пытанне, сфера. Калі мы ініцыялізацыі буфера за межамі з гэтай завесы, ці будзе ён існаваць ўнутры цыкла? НЕКАЛЬКІ СТУДЭНТЫ: Так. Джэйсан Хиршхорн: Так. Яго сфера ахоплівае ўнутры цыклу, і, сапраўды, усё, што ніжэй яго ўнутры гэтага кода, у тым ліку рэчы ўнутры тут. Такім чынам, мы не павінны Malloc яго. Гэта лакальная пераменная, і яе маштабы па-ранейшаму ўключае цыкл. СТУДЭНЦКАЯ 49: Ці трэба нам, каб вызваліць яе? Джэйсан Хиршхорн: Ці ёсць у нас трэба вольнага буфера? СТУДЭНЦКАЯ 49: Так, калі мы не Таноса. Джэйсан Хиршхорн: Ці ёсць у нас трэба вольнага буфера? Мы не ведаем. Зноў жа, гэта лакальная зменная, так што мы не павінны вызваліць яго. ОК. Давайце паглядзім, што адбудзецца. Так што без ініцыялізацыі. Гэта было тое, што тое, што Маркус прапанаваў раней. Таму ў нас ёсць, што памылкі, пераменная буфер ня ініцыялізаваны пры выкарыстанні тут. Як мы можам гэта выправіць? СТУДЭНЦКАЯ 50: Malloc гэта? СТУДЭНЦКАЯ 51: Роўна NULL? СТУДЭНЦКАЯ 52: Скажыце буфера роўны NULL. Джэйсан Хиршхорн: ОК. Выглядае добра. У нас ёсць цяпер. Давайце створым нешта паспрабаваць капіраванне. Так у нас ёсць тэкставы файл. Як мы можам запусціць гэтую праграму? Так. СТУДЭНЦКАЯ 53: Вы можаце зрабіць кропку слэш CP, test.txt. І тады вы можаце назваць яшчэ адзін файл якія ён будзе захоўваць у. Джэйсан Хиршхорн: ОК. Мы будзем называць яго out.txt. Крута? Seg віна. Думкі аб віне сегменце? Гэта вельмі зручна. Як мы можам даведацца, дзе няспраўнасць сегмент з'яўляецца? Што? СТУДЭНЦКАЯ 54: GDB. Джэйсан Хиршхорн: GDB. Мы бяжым GDB, напісаўшы GDB кропка слэш, назва нашай праграмы. Няма аргументаў каманднага радка там. Мы збіраемся ўсталяваць супыну на асноўнай. Калі я хачу, каб пачаць GDB, што мне рабіць? СТУДЭНЦКАЯ 55: Р. Джэйсан Хиршхорн: Р. А што потым? СТУДЭНЦКАЯ 55: Аргументы? Джэйсан Хиршхорн: Тады аргументы каманднага радка. Давайце разгледзім. N проста бярэ мяне радок за радком. Я збіраюся пайсці да Я атрымаю свой сегм няспраўнасць. Там мой сегмент віна. Падобна на тое FREAD выклікала мой сегмент віна. Я ведаю, FREAD выклікала маё сегм віну, таму што гэта было Лінія мы толькі што выканалі. І адзінае, што было адбываецца ў гэтай лініі - дзве рэчы адбываліся. FREAD збіраўся, і затым мы былі робіць некаторыя праверкі час. Я гатовы трымаць заклад, што ПАКУЛЬ праверкі не з'яўляецца прычынай майго сегм няспраўнасць. Хутчэй за ўсё, FREAD было прычынай майго сегм няспраўнасць. Я таксама бачу нешта тут, memcopy. Копія памяці. Падобна на тое, рухаючыся памяць з адно месца да іншага. Падобна на тое, тое, што здарылася б у FREAD, магчыма, некаторыя памяці пераход ад гэтага да гэтага. Давайце пройдземся па гэтых зноў. Як мне пачаць гэта зноў і запусціць яго зноў? Так. СТУДЭНЦКАЯ 56: Вы павінны паставіць Ампэрсанд перад буфера? Джэйсан Хиршхорн: Так Ампэрсанд перад буфер дасць мне адрас буфер, які ўяўляе сабой сімвал *. Давайце разгледзім гэты яшчэ адзін раз. Як запусціць праз яго яшчэ раз? СТУДЭНЦКАЯ 57: Можа вы проста увядзіце запусціць зноў? Джэйсан Хиршхорн: Проста увядзіце працаваць зноў. Такім чынам, мы не збіраемся выканаць гэтую лінію. Так буфера з'яўляецца паказальнікам NULL. Выпраўце? Гэта паказвае на - паглядзім. Калі ў нас ёсць - намаляваць хуткую карціну гэтага. Ці ўсё могуць убачыць, калі Я пішу тут? Так у стэку, у нас ёсць мясцовы пераменная і гэта буфер называецца, і гэта паказальнік на знак. Які адрас гэта сімвал на? СТУДЭНЦКАЯ 58: 0x0. Джэйсан Хиршхорн: Дакладна. Вось што гэта такое. Тут, усярэдзіне буфера, захоўваецца 0x0. Гэта тое, што ў нас ёсць - Ўстаноўка ў нас цяпер. Так гэтая лінія, FREAD, ставіць нешта ад крыніцы, дзе? У гэтай рамкі ці гэтай рамкі? Якую скрыню? Левая скрынку або правую скрынку? Гэта права скрынка. Гэта вынікае за паказальнікам, і змяшчае яго ў тут. Калі мы спрабуем і сэнсарны памяці на Месцазнаходжанне на карце 0, што мы атрымліваем? Сегментацыя віна. Гэта памылка ў нас цяпер. Так. СТУДЭНЦКАЯ 59: Не ва вас ёсць пакласці зоркі буфер? Ці не? Для FREAD? Джэйсан Хиршхорн: Так FREAD прымае паказальнік. Так яна праходзіць у буферы. А потым яна будзе разыменовываются гэта дзесьці ўнутры FREAD. Але зноў жа, мы бачылі, яна займае паказальнік. Нам не трэба, каб перадаць яму зоркі буфер. Гэта было б праходзячы гэта тое, што тут. І гэта, верагодна, даў нам паведамленне пра памылку таму што мы дэ-спасылкі на яго. Ці не так? Калі мы разыменовываются гэты паказальнік, калі мы спрабуем адкрыць месца, мы атрымліваем памылку - наша сегментацыя віна. Так што - упс. Мы збіраемся кінуць з GDB. Наша лінія - наша задача - правільна тут, на гэтай лініі. І гэта праблема, таму што з гэтай лініі. Як мы можам стварыць акно, якое даступны ў FREAD. Ці не так? Нам трэба стварыць акно, якое адзін байт вялікі, памерам з гольца. Але нам трэба, каб акно, каб быць даступным калі гэтая функцыя выконваецца. Дык дзе - так. Ёсць ідэі? СТУДЭНЦКАЯ 60: Проста ўсталяваць яго ў якасці любы выпадковы характар. Проста рабіць Char буфера роўная характар. А потым, калі вы буфер там - Джэйсан Хиршхорн: Пачакайце. Чар буфер? Дык не зоркі? СТУДЭНЦКАЯ 60: Так. Выміце зорку. Роўна выпадковы характар. Джэйсан Хиршхорн: ОК. Так дайце мне адзін. СТУДЭНЦКАЯ 60: Як або што-то. А потым, калі ў вас ёсць буфер там, вы карыстаецеся - СТУДЭНЦКАЯ 61: Зорка? О не, Ампэрсанд. СТУДЭНЦКАЯ 60: Выкарыстоўвайце Ампэрсанд. Джэйсан Хиршхорн: ОК. А як наконт ў FWRITE? СТУДЭНЦКАЯ 60: Выкарыстоўвайце Ампэрсанд зноў. Джэйсан Хиршхорн: Добра. Так ваша ідэя, мы ствараем сімвал і пакласці што-то ў ім, а затым запіс на гэты знак. СТУДЭНЦКАЯ 60: Так. Джэйсан Хиршхорн: Што людзі думаюць? СТУДЭНЦКАЯ 62: Гэта заблытаным. Джэйсан Хиршхорн: ОК. Давайце намалюем яго. Таму ў гэты раз, я збіраюся зрабіць гэта ў чырвоны ў стэку тут, і тады мы будзе мець - ох! Выбачайце. Таму ў гэты раз у нас ёсць тое, што называецца буфер, і гэта ў стэку. Выпраўце? І мы эканомім ў ім у, на пачатковым этапе. Тады ў нас ёсць выклік FREAD. Што FREAD робіць гэта бярэ байт з наш файл і змяшчае яго недзе. Гэта ставіць яго ў любы штука паказваючы на. Ну, перш чым мы мелі гэты адрас - 0x0. Цяпер тое, што адрас у нас ёсць? СТУДЭНЦКАЯ 63: Незалежна адрас буфера. Джэйсан Хиршхорн: Незалежна адрас буфера. Гэта, верагодна, будзе нешта ў гэтым родзе. Напэўна збіраюся пачаць з б і е, а затым шэсць іншых шаснаццаткавыя лічбы. Не мае значэння. Некаторыя адрас. І мы перадаем гэты адрас цалі І мы збіраемся паставіць нашу адну байт, што па гэтым адрасе. Такім чынам, мы збіраемся паставіць нашу адну байт, што ўсярэдзіне тут. А потым мы збіраемся пісаць з што калі-небудзь ўнутры тут. Хто-небудзь ёсць якія-небудзь пытанні пра гэта? Хто думае, гэты код будзе працаваць? Падніміце руку, калі вы лічыце, гэты код будзе працаваць. Вы павінны заняць пазіцыю. А хто думае, што гэта код не будзе працаваць? Падніміце руку. Усё астатняе павінна быць павышэнне іх руку. ОК. Майкл, дзе ты стаіш? Майкл: Я не магу вырашыць. Выгляд у сярэдзіне. Джэйсан Хиршхорн: Ты у сярэдзіне. Выбераце адзін. Майкл: Я буду мець веру і кажуць, што гэта будзе працаваць. Джэйсан Хиршхорн: ОК. Вы будзеце мець веру і сказаць, што гэта працуе? Што здарылася? [Устаўляючы ГАЛАСЫ] Джэйсан Хиршхорн: Няма сегмент віна. Як мы можам праверыць, калі дзве рэчы роўныя? Два файлы роўныя. СТУДЭНЦКАЯ 64: Розніца. Джэйсан Хиршхорн: Розніца. Diff правярае адрозненняў паміж два файла, і калі яна вяртае нічога, яны не ідэнтычныя. І калі мы адкрываем, мы атрымліваем наш файл. Так, каб было правільнае рашэнне. Давайце азірнуцца на яго яшчэ раз. Мы фактычна нават не неабходна ініцыялізаваць яго. Гэта, верагодна, выглядаць трохі чысцей, калі вы не ставіў нешта выпадковае ў там. Справа быцця, вам трэба стварыць некаторы прастору для захоўвання нешта ад FREAD і ўзяць нешта з FWRITE. І, што самае прыйшлося быць лакальнай зменная ў стэку - вы мог бы malloc'd некаторы прастору. Такім чынам, мы на самай справе можа мець напісана Таноса тут, і што б працаваў. І тады мы былі б захоўваць нашы рэчы дзесьці ў кучы. Але гэта на самай справе, напэўна, самае элегантнае рашэнне. Проста стварыце некаторы прастору ў стэку для гэтых рэчаў, каб ісці. Я б яшчэ два заўвагі. Калі б вы былі прыняць паварот у гэтым, і затым атрымаць забіў на гэта, мае каментары будзе выглядаць наступным чынам. Гэтыя 1 тут, са мной, з нецярпеннем як магічных лікаў. Гэтая 1, з пункту гледжання FREAD, мае сэнс. Вось некалькі рэчаў, чытаць, ні пісаць. Але гэта прама тут варта верагодна, будзе нешта іншае. Так што адно рашэнне? СТУДЭНЦКАЯ 65: Памер байта. Джэйсан Хиршхорн: Як што? СТУДЭНЦКАЯ 65: Памер знак. Джэйсан Хиршхорн: Памер знак. Так, байт не з'яўляецца тыпам. Так памер знакавых работ. Мы маглі б, у верхняй частцы наш код, # вызначаецца, што. Выклікаецца нешта BYTE і гэта сапраўды знак. На самай справе, нават лепш, падыход можна было б гэта - UINT. Хто-небудзь ведае, што гэта такое? Выбачайце. Я яго ў зваротным кірунку. Пачакайце, няма. У які бок яна ідзе? Хто-небудзь ведае, што гэта такое? Так. СТУДЭНЦКАЯ 67: Меркаваны, каб дапамагчы стандартаваць праз сістэмы рэчаў, якія ёсць - як цэлыя лікі без знака што ёсць 8 байт? Джэйсан Хиршхорн: Гэта Цалкам дакладна. На розных машынах, памер гольца - як правіла, не сымбаль. Знакаў, як правіла, адзін байт. Але памер іншых тыпаў дадзеных з'яўляюцца розных памераў на 32-бітнай машыне у параўнанні з 64-бітнай машыне. Uint8_t заўсёды 8 біт - заўсёды адзін байт. І мне трэба, каб уключыць, што стандартны файл унутр загаловак. Так што цяпер, гэта будзе, верагодна, былі лепшы спосаб пісаць гэты код. Так што я пазбавіцца ад магічных лікаў. І ў мяне таксама ёсць больш лагічным ўвядзіце для буфера. Гэта не проста сімвал, гэта байт, што і мы чакаем, што ён будзе. І тут, мы на самай справе быў трохі больш надзейнымі. Мы не называючы гэта сімвал, які - можа быць, хто ведае - можа быць іншай Памер на розных машынах. Мы на самой справе кажу, што гэта дакладна адзін байт, заўсёды, нягледзячы ні на што. І калі мы паглядзім тут, мы робім пар. Ой-ой. Што здарылася? СТУДЭНЦКАЯ 68: Гэта можа быць уключаны. Джэйсан Хиршхорн: Што? СТУДЭНЦКАЯ 69: Ці з'яўляецца гэта? СТУДЭНЦКАЯ 70: Вы не зрабілі вызначыць яго як тыпу. СТУДЭНЦКАЯ 71: Але ён павінен быць вызначаны ў стандарце. СТУДЭНЦКАЯ 72: Што адбываецца? СТУДЭНЦКАЯ 73: Калі вызначыць быць усё загалоўныя? Джэйсан Хиршхорн: Так што гэта не # вызначыць. На самай справе, у гэтым выпадку, я збіраецеся выкарыстоўваць ЬурейеЕ. Паколькі мы выкарыстоўваем яго ў якасці Тып у адным месцы. Такім чынам, у гэтым выпадку, мы на самай справе хочам TypeDef як мы друку новага тыпу байт, і гэта, па сутнасці, гэта. Гэта крыху адрозніваецца ад # вызначыць. А цяпер, наш код працуе выдатна. Так, зноў жа, # вызначыць нешта бярэ, замяняе яго ўсюды з другога рэчы. Гэта проста макра - скарачэнне, каб пазбавіцца ад магічных лікаў. Але ў дадзеным выпадку, таму што мы выкарыстоўваць яго ў якасці тыпу - прама тут - для таго, каб гэта працавала, мы павінны каб TypeDef што байт. І мы вызначаем яго прама тут. Гэта не структура, гэта на самай справе проста цэлы лік без знака. Гэта адзін байт. Гэты код будзе даступная ў Інтэрнэце, і Вы ўсе павінны мець гэта прама цяпер. Таму ў нас ёсць - ідэальна - 13 хвілін з'ехаў, каб пайсці над праблемай ўсталяваць 5. Я хачу, каб ісці праз copy.c разам, і тады мы будзем коратка казаць пра іншых частках праблемы усталяваны. Такім чынам, дазвольце мне падцягнуць copy.c. І выдатна, што ёсць, мы на самай справе ужо напісаў шмат гэтага кода. Код, які мы пісалі літаральна толькі выйшаў адсюль, калі мне было пішу гэта на маю ўласную. Але гэта copy.c, фармуе аснову на працягу першых двух частках праблема усталяваны для whodunit.c, які вам трэба напісаць, і Змена памеру. Recover.c, які з'яўляецца трэцім і апошнім частка мноства задач, не заснаваныя ад гэтага файла. Вы будзеце мець патрэбу, каб напісаць гэты файл, мы даем вам шаблон для гэтага файл, але гэта не мае ніякага дачынення рабіць з copy.c. Але паколькі copy.c з'яўляецца асновай для першыя дзве часткі, мы збіраемся ісці праз яго цяпер, так што вы павінны добрае пачуццё, што ён робіць. І каментары даваць некаторыя з іх далёка. Мы ўжо пісалі некаторыя з гэтага. Па-першае, мы робім, што мы атрымліваем тры аргумэнты. Далей, мы успамінаючы імя файла. Такім чынам, мы прапусцілі гэты крок, калі мы кадзіравалі сваю справу - калі наша пар. Але тут, яны робяць яго крыху чысцей. Яны правяраюць, каб пераканацца, абодва файла добрыя, у дадаткам да іх адкрыцця. Мы напісалі ўвесь гэты код толькі цяпер, так што я не збіраецца спыняцца на гэтым кодзе. Наступная некаторы матэрыял гэта спецыфічныя для тыпы файлаў мы выкарыстоўваем,, якія з'яўляюцца растравых файлаў. Растравыя файлы маюць некаторыя метададзеныя звязаныя з імі. Такім чынам, першая пара байтаў распавесці вам аб файле. Яны не з'яўляюцца кветкамі піксель у гэтым малюнку. Яны кажуць вам аб файле. І калі вы чытаеце праз набор праблем, вы будзеце мець значна больш інфармацыі на якія тыпы структур метададзеных ўключаны з кропкавымі малюнкамі. Але менавіта таму ў нас ёсць гэты першы набор - гэты код прама тут. Мы чытаем метададзеныя - дзве часткі метададзеных - файл загаловак і інфармацыйны загаловак. І мы правяраем некаторыя яго часткі, каб пераканайцеся, што ён з'яўляецца сапраўдным Выява растравага перш чым працягнуць. І зноў жа, гэта дэталі мы не трэба ісці ў цяперашні час. Калі вы чытаеце праз набор праблем, Вы зразумееце гэта. Карацей кажучы, яны проста кажу, гэта файл малюнка, і пацверджанне таго, што. Далей, мы пішам тыя у файл вонкі. Мы бачым, што тут. Мы пішам на вонкавы паказальніка. Далей, мы вызначэння запаўнення. Такім чынам, яшчэ раз, як гэта асаблівасць з Выява растравага, некаторыя лініі ўключаюць у сябе абіўка ў канцы. І калі вы чытаеце праз набор праблем, вы даведаецеся больш пра абіўка. Гэта і ёсць формула, каб знайсці дадатак. Важна памятаць - пры змене памеру растравага малюнка файл, змены запаўнення. Пры змене памеру файл, змены запаўнення. Гэта ніколі не будзе больш, чым 3 - гэта будзе ад 0 да 3 уключна. Але калі вы змяніць памер нешта, змены абіўка. Калі ў мяне ёсць толькі адзін піксель у гэтай радку, я трэба тры байта запаўнення, паколькі кожны радок павінна быць кратныя чатыром байт даўжынёй у растравы файл. Але калі я яго падвоіць, каб перайсці ад аднаго пікселя на два пікселя, кожны з якіх, скажам так, з'яўляецца байт, то мне трэба два байта запаўнення, каб зрабіць што роўна чатыром. Таму, калі я змяніць памер чагосьці, Мне трэба змяніць колькасць абіўка ў мяне ёсць. Ці мае гэта сэнс для ўсіх? Далей, мы перабору кожнага радка, або па ўсіх радках. А потым мы перабіраем кожны слупок у кожнай радку. Мы лячэнні гэтага растравы малюнак як сетка, як мы разглядалі плата ў 15. Як мы лячылі цэглу, калі мы друкавалі іх на экране. Сетка з радкоў і слупкоў. Тады - мы бачылі гэта. Мы на самой справе проста закадаваныя гэта. Мы стварылі некалькі часовае захоўванне. Мы чытаем у там, а затым мы пішам яго. Гэта менавіта тое, што мы толькі што зрабілі. Далей, таму што я сказаў кожны радок заканчваецца ў пэўным абіўка, мы прапусціць гэтага дапаўненні - стары абіўка. А потым мы зноў дадаць яго. У гэтым выпадку, мы ствараем сапраўды такі жа файл. Мы проста капіюючы яго. Так гэтая лінія па-дурному. Мы маглі літаральна толькі паставіць пракладку цалі Але калі вы зменіце памер файла, Вы ўсё яшчэ хочаце гэтую лінію? Так што, калі мы зменім памер файла, мы па-ранейшаму жадаюць, каб прапусціць па-над старой пракладкі? СТУДЭНЦКАЯ 74: Так. Джэйсан Хиршхорн: Так мы робім. Таму што гэта, зноў жа, здзелкі з зыходным файлам. Мы не клапоцімся пра абіўка з зыходнага файла. Мы хочам, каб перайсці да наступнай радку. Але мы не проста пакласці назад стары Аб'ём запаўнення. Мы павінны пакласці назад новы Аб'ём запаўнення. Таму, калі мы мяняем памер файл, мы ўсё яшчэ хочам, каб прапусціць абіўка ў старым файле - тое, што мы чытаем у ад. Але тое, што мы пішам, каб, мы збіраемся неабходна змясціць назад некалькі адрозніваецца колькасць абіўка, што мы вызначылі. Так. СТУДЭНЦКАЯ 75: Парадак гэтых двух лініі не мае значэння, ці не так? Таму што вы апрацоўкі розныя файлы. Джэйсан Хиршхорн: Цалкам дакладна. Парадак гэтых двух ліній не мае значэння. Мы пішам гэтую лінію. Гэта тут для файла мы пішам, каб. Гэта важна, так што мы атрымліваем Патрэбную колькасць абіўка. Гэта мае справу з файлам ст. Мы хочам, каб прапусціць права над пракладкай. Мы не хочам, каб прачытаць - калі мы чытаем байт за адзін раз, мы не клапоцяцца пра тых дададзеную зь байты. Мы хочам, каб перайсці да наступнай радку. Нарэшце, як і Люсі даў для нас, мы закрываем файлы і вяртаць 0. Так што гэта copy.c. І мы на самай справе напісаў - мы правялі вялікую частку раздзел пішу гэта, па сутнасці. Вы зрабілі гэта. Так што, спадзяюся ў вас ёсць добрае пачуццё пра тое, што адбываецца тут. Вялікая розніца, калі шчыра, гэта проста гэта першая частка, якая займаецца асаблівасці растравых файлаў. Так што ў мяне, як мой наступны слайд, Дык што ж нам рабіць? Ну, давайце падумаем пра дэтэктыўны раман. І для таго, хто прачытаў праблема ўсталяваць, што ж мы трэба зрабіць у дэтэктыўны раман? Проста. Алея. ALEJA: Ці можаце вы прыняць тую частку кожнага пікселя, якая пазначае чырвоны колер. А потым - выгляд? Джэйсан Хиршхорн: ОК. Так вывезці частка кожнага піксель, які пазначае чырвоны колер. Гэта блізка, але не ўсё. СТУДЭНЦКАЯ 76: Ну, ёсць розных спосабаў зрабіць гэта. Джэйсан Хиршхорн: ОК. Дайце мне адзін бок. СТУДЭНЦКАЯ 76: Выміце усе чырвоныя, і затым падкрэсліць сіні і зялёны. Джэйсан Хиршхорн: ОК. Таму, улічваючы абодва гэтыя шляхі - гэта гучыць як мы даем яму піксель, гэта мае чырвоны, сіні і зялёны ўзровень. Мы хочам змяніць адносныя ўзроўні чырвоны, сіні і зялёны, у залежнасці на гэтым пікселі. Дзе ў гэтым кодзе мы павінны змяніць адносная чырвоны, сіні і зялёны ўзроўні дадзенага пікселя. Пасля таго як мы чыталі яго - перш, чым мы пісаць? Дайце мне нумар радка. НЕКАЛЬКІ СТУДЭНТЫ: 83. Джэйсан Хиршхорн: 83. Так прама тут. Для дэтэктыўны раман, код трэба запісы ўсе павінны ісці прама там. І гэта толькі код вам трэба напісаць. Таму што, як мы пачулі, усё што вам трэба зрабіць, гэта змяніць гэтыя адносную сіні, чырвоныя, і зялёныя ўзроўні ад кожнага пікселя. Вы чыталі яго, і цяпер вы збіраюся напісаць яго. Як я магу атрымаць - калі ў мяне ёсць гэтая рэч называецца патройны, прама тут, і гэта не мае увядзіце RGBTRIPLE - добра, калі б мы глядзелі ў bmp.h, што RGBTRIPLE? СТУДЭНЦКАЯ 77: Гэта структура. Джэйсан Хиршхорн: RGBTRIPLE з'яўляецца структурай. Мы бачым, што прама тут. І таму, калі я хацеў доступу, скажам, чырвоны ўзровень структуры, як мне доступ чырвоную ўзровень гэтай структуры? [КЛАС мармыча] СТУДЭНЦКАЯ 78: RGBTRIPLE.rgbtred? Джэйсан Хиршхорн: Гэта правільна? СТУДЭНЦКАЯ 79: Яна павінна быць трайная кропка, а RGBTRIPLE кропкай? Джэйсан Хиршхорн: Трехмясцовый. Трехмясцовый з'яўляецца лакальнай зменнай, таму тут, няма ніякіх паказальнікаў тут. Так што мы проста выкарыстоўваюць кропку. Гэта дасць мне ўзровень чырвоны. Калі я хачу, каб змяніць яго, я проста ўсталяваць гэта складзе нешта іншае. Такім чынам, яшчэ раз, гэты радок кода атрымлівае доступ гэтая пераменная ўнутры гэтай структуры, і мы можам усталяваць яго на нешта новае. Такім чынам, для дэтэктыўны раман, зноў жа, гэта, па сутнасці, тое, што мы павінны зрабіць. Вельмі проста. Проста змяніць некаторыя адносныя ўзроўні, і гэта дзе гэты код ідзе. Змяненне памеру, з другога боку, крыху больш складана. На самай справе, змены памеру, верагодна, складаная частка гэтай праблемы ўсталюеце. У нас ёсць тры хвіліны, каб пайсці па ім. Але зноў жа, мы ўжо пісалі большасць з гэтага кода, таму мы павінна быць даволі знаёмыя. Якія некаторыя рэчы, якія мы хочам зрабіць у змяніць памер, калі вы чыталі над Праблема ўсталяваць? Калі вы дасце іх мне, мы можа гаварыць пра іх. Якія некаторыя рэчы, якія мы хочам зрабіць? СТУДЭНЦКАЯ 80: Вертыкальна - так што вам прыйдзецца па гарызанталі змяніць яго памер, але вертыкальна змяніць яе памер, а? Джэйсан Хиршхорн: Дык што, калі нам даюць піксель, і мы хочам змяніць яго, у два разы, цяпер ён павінен быць зменены па гарызанталі і змены памеру па вертыкалі. Ці мае гэта сэнс? Так. Так што, напэўна, Самай вялікай праблемай. І мы будзем казаць пра тое, што ў с. Так. СТУДЭНЦКАЯ 81: Тое, як я думаў пра гэта быў вам трэба раздрукаваць яго - Джэйсан Хиршхорн: Пачакайце. Не кажыце нам, што вы зрабілі. Мы збіраемся казаць у логіцы. СТУДЭНЦКАЯ 81: ОК. Які быў пытанне? Джэйсан Хиршхорн: Вы толькі што падняў руку. Там не было і гаворкі. Дазвольце мне прадставіць яго. Дазвольце мне абмеркаваць гэта коратка. Такім чынам, мы ў адзін піксель, мы хочам паўтарыць яго па гарызанталі і па вертыкалі. Так што тэарэтычна, што мы робім тут, мы чытаць у нашай пікселя, запішам яго Аднак многія з часоў. Але тады ў нас ёсць трук тут, таму што то мы хочам, каб перайсці да Наступная радок і напісаць гэта на пачатак наступнага радка. Так што калі мы хочам паўтарыць абодва гарызанталі і вертыкалі, што гэта адзін добры спосаб зрабіць гэта - адзін добры, хоць гэта зрабіць? Такім чынам, мы не павінны пастаянна шукаць вакол нашага файла размясціць рэчы. Гэтае пытанне, магчыма, не мела сэнс, але я думаю, адказаць на яго дапаможа. СТУДЭНЦКАЯ 82: Стварэнне масіва? Джэйсан Хиршхорн: Так што давайце думаць кожнага файла ў якасці запар. Давайце думаць у тэрмінах радкоў. Калі ў нас ёсць першы шэраг ад нашай маленькай карціна, мы можам зрабіць гэты радок у вялікай шэрагу ад вялікай карціны, а затым паўтарыць гэты радок аднак шмат разоў гэта павінна быць прайграныя, замест таго, каб піксель за пікселем, якая збівае з толку, калі працы з файламі. Таму што, калі мы мелі - Я бягу з космасу. Калі гэта наш файл, і ў нас ёсць, што адзін піксель ёсць, і мы хочам, каб пакласці яго тут жа, у нас яшчэ ёсць некаторыя рэчы, што трэба ісці туды, калі мы пісаць і стварэння нашага новага файла - наш файл, што гэта ў два разы больш. Але гэта сапраўды цяжка з файлавых функцый прапусціць вакол, каб новых ліній так, а затым вярнуцца сюды і навесці там. Гэта амаль немагчыма зрабіць нешта так, калі гэта мае сэнс. Так што, калі мы думаем ў тэрмінах радкоў, мы можам ўзяць нашу радок, а затым пакласці яго - паўтарыць радкі па вертыкалі. І вось як мы маем справу з змены памеру вертыкальна, а не гарызантальна. Гэта было збольшага хутка, і трохі заблытаным. На жаль, наш час скончыўся. Я буду стаяць на вуліцы для тых з вас, тут, у каго ёсць пытанні з нагоды Праблема набор, у тым ліку аднавіць. Так што давайце адкласці на дадзены момант. І зноў жа, калі ў вас ёсць якія-небудзь пытанні, мы можам мець зносіны на вуліцы.