[Powered by Google Translate] [ДЕО 5: мање комфорни]
[Нејт Хардисон, Универзитет Харвард]
[Ово је ЦС50.] [ЦС50.ТВ]
Па добродошао назад, момци.
Добродошли у секцији 5.
У овом тренутку, пошто је завршио квиз 0 и видевши како си урадио,
надам се да се осећате стварно добро, јер сам био веома импресиониран резултатима у овом одељку.
За наше онлине гледалаца, имали смо пар питања
о последња два проблема на проблем сету - или на квизу, а.
Дакле, ми ћемо да идемо преко оне веома брзо, тако да свако види оно што се десило
и како да иде кроз стварне решење него само гледање самог решење.
Ми ћемо ићи у последњих неколико проблема веома брзо, 32 и 33.
Само, опет, тако да гледаоци могу да виде онлајн ово.
>> Ако окренемо свом проблему 32, који се налази на страни 13,
13 од 16, 32 Проблем је све о свопови.
Све је око замене два цела броја.
То је проблем који смо отишли ​​преко неколико пута у предавању.
А овде, шта смо тражили да урадите је да брзо меморије траг.
Да бисте попунили вредности варијабли као што су на стеку
као код пролази кроз овај свап функцију.
Конкретно, оно што тражимо - Идем да ставим ову иПад доле -
посебно, оно што тражимо је ова линија бројевима овде 6 право.
И то је бројала 6 за само суседство са претходним проблемом.
Оно што ми желимо да урадимо је да прикаже или означи стање меморије
јер је у време када смо изврши ову линију број 6,
који је ефективно повратак из наше свап функцију овде.
Ако се помицати овде доле, видели смо да је адресе свега у меморији предвиђено за нас.
Ово је веома кључ, а ми ћемо се вратити на то у само једном тренутку.
А онда овде доле на дну, имали смо мало меморије дијаграм који ћемо односе.
Заправо сам ово урадио на мојој иПад.
Зато ћу да бирате и назад између иПад и овог кода само за референцу.
>> Почнимо. Прво, хајде да се фокусирамо на првих неколико линија главни овде.
За почетак, ми ћемо да се покрене к на 1 и и до 2.
Дакле, имамо два целобројне променљиве, они обојица ће бити постављени на стек.
Ми ћемо ставити 1 и 2 у њима.
Дакле, ако сам пребацити на мој иПад, надамо се, да видимо -
Аппле ТВ мирроринг, и тамо идемо. Ок.
Дакле, ако сам пребацити на мој иПад,
Желим да се покрене к на 1 и и до 2.
Ми то радимо сасвим једноставно писање 1 у пољу означеном к
и 2 у оквиру обележен год. Прилично једноставно.
Дакле, хајде да се вратимо на лаптоп, да видим шта се даље дешава.
Дакле, ово је место где следећа линија се ствари лукав.
Пролазимо адресу Кс и И адресу као параметре и б на свап функцију.
Адреса од к и адресу и су ствари које не можемо да израчунавање
без позивања на ове метком истиче право доле.
И срећом, прва два метка бода нам рећи тачно шта су одговори.
Адреса од к у меморији је 10, а адреса и у меморији је 14.
Дакле, то су вредности које се прошли у што и б до врха у нашем свап функцију.
Па опет, пребацивање назад на нашем дијаграму, ја могу написати 10 у
и 14 у б.
Сада, ова тачка је место где ћемо наставити са свап.
Дакле окретањем назад на лаптоп опет,
видимо да је начин на који функционише своп је сам први дереференце и продавница резултат у тмп.
Дакле дереференце оператер каже: "Хеј, Треат садржај променљива као адресу..
Иди на све што се чува на тој адреси, и учитати га. "
Оно што учитати из променљиве ће бити ускладиштен у наше тмп променљиве.
Флиппинг назад на иПад.
Ако одемо на адресу 10, знамо да је адреса 10 је варибле к
јер смо рекли наше тачки која је адреса од к у меморији је 10.
Дакле, можемо да идемо, добијају вредност ње, која је 1, као што видимо на нашем иПад,
и оптерећења која у тмп.
Опет, ово није коначни садржај.
Идемо да ходају кроз и ми ћемо доћи до нашег коначног стања програма на крају.
Али сада, имамо вредност 1 ускладиштен у тмп.
>> А ту је и брзо питање овде.
[Александар] Да ли је дереференце оператера - то је само звезда испред променљиве?
>> Да. Дакле дереференце оператера, као што окренете назад на наше лаптоп поново
је ова звезда испред.
У том смислу, то је - то контрасту са оператером множења
која захтева две ствари, а дереференце оператор унарни оператор.
Само примењује на једној вредности насупрот бинарни оператор
где се односи на две различите вредности.
Дакле, то је оно што се дешава у овој линији.
Ми учитана вредност 1 и складишти га у наш привремени целобројну променљиву.
Следећа линија, чувамо садржај б у -
или, тачније, чувамо садржаје који указују на б се на месту где је окренут ка.
Ако анализирамо ово са десна на лево, ми ћемо дереференце б,
ћемо да се обрати 14, ми ћемо да зграби цео број који је тамо,
а онда ћемо ићи на адресу 10,
и ми ћемо бацити резултат нашег дереференце Босне у том простору.
Флиппинг назад на нашу иПад, где можемо направити ово мало конкретније,
то би могло да помогне ако ја пишем овде бројеве на све адресе.
Дакле, ми знамо да је и, ми смо на адресу 14 к је на адреси 10.
Када смо се крећу б, ми дереференце б, идемо да зграбите вредност 2.
Ми ћемо да ухватите ову вредност јер је вредност која живи на адреси 14.
И ми ћемо то ставити на променљиве која живи на адреси 10,
што је ту, што одговара нашим променљиве к.
Дакле, можемо да урадимо мало замене овде
где смо се ослободимо наше 1 и уместо тога написати 2.
Дакле, све је добро и добро у свету, иако имамо сада преписан к.
Сачували смо Кс. стару вредност у нашем тмп променљиве.
Дакле, можемо да заврши замену са следећом линијом.
Флиппинг назад на наш лаптоп.
Сада све што остаје је да се садржај из нашег привременог целобројну променљиву
и складиштите их у променљиву која живи на адреси која б се држи.
Дакле, ми ћемо да се ефикасно дереференце б да приступ променљива
који је на адресу коју б држи у њој,
и ми ћемо да ствари на вредност која се држи тмп у њега.
Флиппинг назад на иПад још једном.
Ја могу избрисати овде ову вредност, 2,
и уместо тога ћемо копирате 1 право у њега.
Онда следећа линија која извршава, наравно -
ако се окренете назад на лаптоп - је ова тачка 6,
што је тачка у којој смо хтели да имамо дијаграм потпуно попуњена.
Дакле окретањем назад на иПад још једном, само тако можете видети завршен дијаграм,
можете видети да имамо 10 у, 14 у Б, 1 у тмп, 2 у Кс, и 1 у год.
Има ли било каквих питања у вези овога?
Да ли то има више смисла, пошто је прошао кроз њу?
Направите мање смисла? Надам се да не. Ок.
>> Показивачи су веома лукав тема.
Један од момака са којима радимо има веома заједничку изреку:
"Да бисте разумели смернице, прво морате разумети показиваче."
Што мислим да је веома тачно. То се потрајати да се навикнем на њега.
Цртање пуно слика, цртеж много меморијских дијаграма као што је овај су веома корисна,
и након што прође кроз пример после пример после пример,
да ће почети да се мало више смисла и мало више разума и мало више смисла.
Коначно, једног дана, ви ћете имати све потпуно савладао.
Сва питања пре него што пређемо на следећи проблем? У реду.
Дакле, окренете назад на лаптоп.
Следећи проблем који имамо је проблем број 33 о фајлу И / О.
Зумирање на овом мало.
Проблем 33 - Да?
>> [Данијел] Управо сам брзо питање. Ова звезда, или звездицу,
Зове се дереференцинг када користите пре звездицу.
Како се зове кад користите амперсанд раније?
>> Амперсендом пре него што је адреса-оператора.
Дакле, хајде да помицати назад.
Упс. Ја сам у зоом моду, па ја не могу баш померање.
Ако гледамо на овом коду веома брзо овде,
опет иста ствар се дешава.
Ако гледамо на овом шифром овде, на овој линији где правимо позив да замени,
амперсендом је само рекао: "добијете адресу на којој променљиве к животе."
Када ваш компајлер саставља свој код,
има да се заиста физички одвојити место у меморији за све ваше варијабли да живе.
И тако шта компајлер може да уради онда када буде сачињен све,
она зна "Ох, ставио сам к на адреси 10 год сам ставио на адреси 14.."
То онда може попунити у овим вредностима за вас.
Дакле, онда може - може да прође онда ово и пролазу & И у као добро.
Ови момци добили адресу, али су, такође, када их прође у своп функцију,
овај тип информација, ова инт * овде, говори компајлеру,
"У реду, идемо да се тумачи ову адресу као адресу целобројне променљиве."
Као адресе за инт, која се разликује од адресе карактера променљиве
јер инт заузима, на 32-битном рачунару, заузима 4 бајта простора,
док лик само заузима 1 бајт простора.
Дакле, важно је да се зна шта је - шта живи, који тип вредности
живи на адресу коју је добио за прошли
Или адреса коју сте се баве.
На тај начин, ви знате колико бајтова информација да стварно оптерећење од вашег РАМ меморије.
А онда, да, ово дереференце оператера, као и ви тражили,
иде и приступа информацијама на одређеној адреси.
Тако се каже, са овом променљивој овде, третирају садржај као адресу,
иди на ту адресу, и извуците, учитати у процесор, оптерећења у регистар
стварне вредности или садржај који живе на тој адреси.
Има ли још питања? То су добра питања.
Сувише је много нових термина.
То је такође врста функи, видећи & и * у различитим местима.
>> У реду.
Вратимо се проблему 33, поднесе И / О.
Ово је био један од оних проблема који мислим пар ствари догодило.
Један, то је релативно нова тема.
Представљен је ускоро пред квизу,
и онда мислим да је то било нешто као једна од оних речи проблема у математици
где су вам дати много информација, али заправо не завршавају морају да користе гомилу тога.
Први део овог проблема је описујући шта ЦСВ фајл.
Сада, ЦСВ фајл, према опису, је раздвојених зарезима вредности фајл.
Разлог су уопште занимљив, а разлог сте икада их користите,
је, јер је, како су многи од вас икада користио ствари као Екцел?
Графикон већина вас, вероватно, или ће користити у неком тренутку у свом животу.
Ви ћете користити нешто као Екцел.
Да би добили податке из Екцел табеле или да урадите било какву обраду са њом,
ако сте желели да напишете Ц програм или Питхон програм, Јава програма,
да се баве подацима ускладиштеним сте тамо,
један од најчешћих начина да изађу у ЦСВ датотеци.
И можете отворити Екцел и када одете на 'Саве Ас' дијалог,
можете изаћи стварну ЦСВ датотеку.
>> Ханди да знају како да се носе са тим стварима.
Начин на који функционише је да је слично - Мислим, то је у суштини то имитирање табелу,
где је, као што видимо овде, у врло лева комад,
имамо све презимена.
Дакле, имамо Малан, затим Хардисон, а затим Бовден, МацВиллиам, а затим Цхан.
Сва презимена. А онда запета одваја презимена из прва имена.
Дејвид, Нате, Роб, Томи и Замила.
Ја сам увек мешају Роби и Тома.
И онда, коначно, трећа колона је емаил адресе.
Када схватите да је остатак програма је прилично једноставан за примену.
Оно што смо урадили у циљу да опонашају ову исту структуру у нашем програму Ц
се користили смо структуру.
Ми ћемо почети да играте са њима мало више као добро.
Ми смо их видели први мало у проблему сету 3, када смо били бави речника.
Али ово особље струцт складишти презиме, а прво име и е-маил.
Баш као што је наш ЦСВ датотеке је складиштење.
Дакле, ово је само претварање из једног формата у други.
Морамо да конвертујете, у овом случају, а струцт запослених у линији,
раздвојених зарезима линија, баш тако.
Да ли то смисла? Ви сте сви узети квиз,
па замислите да сте барем имали мало времена да размислим о томе.
>> У изнајмљивање функцији, проблем пита нас да у - ве'лл зум у овом мало -
узети у кадровској структури, особље струцт, са име с
и додати његов садржај нашег стафф.цсв фајл.
Испоставило се да је то прилично једноставан за коришћење.
Ми ћемо некако играти са овим функцијама мало висе данас.
Али у овом случају, иф функција је заиста кључ.
Дакле, са иф, можемо да штампамо, баш као да сте користили принтф целу ову мандат.
Можете принтф линија у датотеци.
Дакле, уместо да само што је уобичајена принтф позив где јој дају ниску формата
и онда замени све променљиве са следећим аргументима,
са иф, ваш први аргумент је уместо датотека желите да пишете.
Ако смо били да погледамо ово у апарату, на пример, човек фпринтф,
можемо да видимо разлику између принтф и фпринтф.
Ја ћу увећали овде мало.
Дакле, са иф, ми га дати стринг формат, а затим наредни аргументи
су све варијабле за замену или замена у нашој формата низа.
Док са иф, први аргумент је заиста овај фајл * зове поток.
>> Померање назад овамо на нашу плату,
Већ смо добили наш * фајл поток отворен за нас.
То је оно што ова прва линија ради, то отвара стафф.цсв фајл,
он га отвара у Аппенд моду, и све што је остало да урадимо јесте
напише структуру запослених у датотеци.
И, да видимо, да ли желите да користите иПад?
Ја ћу користити иПад. Имамо празнину - нека се ово стави на сто, тако да могу да пишем мало боље -
поништи запосли и узима у једној речи, а структура запослених зове с.
Имам своје протезу, имамо нашу ФИЛЕ * зове фајл,
имамо фопен линију дато нама,
и ја ћу га написати као тачке, јер је већ у ПЕДИА.
А онда на нашем следећем реду, идемо да направимо позив иф
и ми ћемо проћи у фајлу који желимо да штампате,
а онда наш формат стринг, који -
Ја ћу вас момци реците ми како то изгледа.
Како о вама, Стела? Да ли знате шта је први део формата низа изгледа?
[Стелла] Нисам сигуран. >> Слободно питајте Јимми.
Да ли знате, Јимми?
[Џими] Да је само бити последњи? Не знам. Нисам сасвим сигуран.
>> Реду. Шта кажеш, да ли неко да ово тачно на испиту?
Но реду.
Испада да је овде све што треба да урадите је да желимо сваки део нашег особља структуре
да се штампа као стринг у нашем датотеке.
Ми само користимо стринг супституција лику три различита пута, јер имамо презиме
следи зарез, онда прво име праћено зарезом,
и онда на крају е-маил адреса која следи - што није
постављања на мом екрану - али то је праћено нови ред карактера.
Тако да ћу написати само доле.
А онда следи наш формат стринг,
имамо само замене, које смо приступили помоћу дот нотацију
које смо видели у проблему сету 3.
Можемо користити с.ласт, с.фирст и с.емаил
да замени у те три вредности у нашој формата низа.
Па како је то иде? Смисла?
Да? Не? Вероватно? Ок.
>> Коначна ствар коју смо урадили пошто смо штампа и након што смо отворили нашу датотеку:
кад смо отворили фајл, увек имамо на уму да бисте га затворили.
Јер иначе ћемо завршити цури меморије,
користи се фајл-дескрипторе.
Дакле, да бисте га затворили, чија је функција да користимо? Данијел?
[Данијел] фцлосе? >> Фцлосе, тачно.
Дакле, последњи део овог проблема је да се правилно затворите фајл, користећи фцлосе функцију,
који само изгледа тако.
Не превише луд.
Кул.
Дакле, то је проблем 33 на квизу.
Имаћемо сигурно више фајл И / О долази.
Ми ћемо учинити нешто више у предавању данас, или у одељку данас,
јер то је оно што ће се формирати већину овог предстојећег псет.
Идемо даље са квизу у овом тренутку. Да?
>> [Шарлот]] Зашто фцлосе (датотека) уместо фцлосе (стафф.цсв)?
>> Ах. Јер испада да је - па се поставља питање, што је велики један,
Зато, када пишемо фцлосе, ми писање фцлосе (датотека) стар променљиву
за разлику од имена датотеке, стафф.цсв? Да ли је то тачно? Да.
Дакле, хајде да погледамо. Ако бих се вратите на мој лаптоп,
и погледајмо на фцлосе функцију.
Дакле фцлосе функција затвара ток и потребно је у показивача до потока који желимо да се затвори,
за разлику од стварног имена датотеке које желите да затворите.
А то је зато што се иза сцене, када упутите позив фопен,
када отворите датотеку, заправо додељивање меморије за складиштење информација о фајлу.
Дакле, имате фајл показивач који има информације о фајлу,
као што је отворен, његова величина, где се тренутно налазе у датотеци,
тако да можете да читање и писање позиве том месту у фајлу.
Можете завршити затварање показивача уместо затварања датотеке име.
>> Да? [Данијел] Дакле, да би користили плату, да ли би рекли - како то добије унос корисника?
Да ли иф понашају као ГетСтринг у смислу да ћу чекати корисничког уноса
и замолите да куцате ово - или чекају да куцате ове три ствари?
Или морате да користите нешто да спроведе плату?
>> Да. Дакле, ми нисмо - питање је, како смо добили унос корисника
у циљу спровођења плату? И шта имамо овде је саговорник за изнајмљивање,
донесен у овом особља струцт са свим подацима који су ускладиштени у струцт већ.
Дакле, иф је у стању да напише само да податке директно у датотеку.
Нема чекања корисничког уноса.
Корисник је већ дао допринос тако га правилно стављање у овом особља струцт.
И ствари, наравно, да ли би се сломити ако било који од ових показивача били нулл,
па смо се помицати овде и гледамо нашу струцт.
Имамо ниске последњи, жица, жица прво поште.
Сада знамо да сви они стварно, испод хаубе, су цхар * променљиве.
То може или не може бити усмерена на нулл.
Они могу бити усмерена на меморију на гомили,
Можда меморије на стек.
Ми стварно не знам, али ако било који од ових показивача су нула, или неважећа,
да то ће сигурно срушити нашу функцију запосли.
То је нешто што је мало изван оквира испита.
Нисмо бриге око тога.
Сјајно. Ок. Дакле, креће на из квиза.
>> Хајде да затворимо овог момка, а ми ћемо да погледамо псет 4.
Дакле, ако ви погледате псет спецификације, када можете да приступите, цс50.нет/куиззес,
ћемо да прођемо кроз неколико проблема одељка данас.
Ја скролујете доле - део питања почиње на трећој страници псет спец.
И први део вас пита да иду и гледају на кратко преусмерава и цеви.
Која је врста супер кратак, показује неке нове, лепе командне линије трикове које можете да користите.
И онда имамо неколико питања за вас као добро.
Ово прво питање о потока, на који иф пише по дефаулту,
врста дотакли смо на само мало пре тренутак.
То иф да смо само разговарали узима у потоку ФИЛЕ * као свој аргумент.
фцлосе узима у потоку ФИЛЕ * као и,
а повратна вредност фопен вам даје ФИЛЕ * ток, као добро.
Разлог нисмо видели оне раније, када смо се већ бавили принтф
је зато принтф има подразумевани ток.
И подразумевани ток на који се пише
ћете сазнати о томе у кратком.
Дакле, дефинитивно погледајте на њега.
>> У одељку данашњем ћемо разговарати мало о ГДБ,
јер је више упознати сте са њим, више пракса сте добили уз њега,
боље могућности ћете бити заиста ловити грешке у свом коду.
Ово убрзава процес дебаговања се страховито.
Дакле, помоћу иф, сваки пут када то морате да компајлирате свој код,
морате да га поново покренете, понекад морате да кретати принтф позив,
коментар из кода, то траје само неко време.
Наш циљ је да покуша и убеди вас да са ГДБ, у суштини могу
принтф ништа у било ком тренутку у свом коду и да никада не морате да га компајлирате.
Ви никада нећете морати да започне и води нагађања где принтф следећи.
Прва ствар коју треба да урадите је да копирате ову линију и добити код одељка искључивање Интернету.
Ја копирање ову линију кода који каже, "вгет хттп://цдн.цс50.нет".
Ја ћу да га копирали.
Ја ћу да одем до мог апарата, умањите тако да можете видети шта радим,
лепљење га тамо, и кад сам ударио Ентер, ово вгет команда буквално веб добити.
То ће да се сруши овај фајл искључивање Интернета,
и то ће га сачувате у текућем директоријуму.
Сада, ако сам списак мој тренутни директоријум можете видети да сам добио ову сецтион5.зип фајл унутра.
Начин да се носе са тим момком је да га унзип,
што можете да урадите у командној линији, баш овако.
Сецтион5.зип.
То ће га распаковати, креирајте фолдер за мене,
надувати све садржаја, ставите их тамо.
Тако да сада могу да одем у рубрици 5 директоријума помоћу цд команду.
Обришите екран помоћу јасно. Дакле, јасно је екран.
Сада имам лепу чисту терминал да се баве.
>> Сада, ако сам списак свих датотека које видим у овом директоријуму,
видиш да имам четири датотеке: бугги1, бугги2, бугги3 и бугги4.
Такође сам добио своје одговарајуће. Ц фајлове.
Нећемо гледати на ц фајлове. За сада.
Уместо тога, ми ћемо да их користимо када смо отворили ГДБ.
Смо их држали око, тако да имамо приступ стварној изворни код, када користимо гдб,
али је циљ овог дела одељка је да пртљати около са ГДБ
и видимо како можемо да га користимо да схватим шта се дешава у реду са сваком од ова четири бугги програма.
Дакле, ми ћемо само на око соби заиста брзо,
и ја ћу да питам некога да покрене један од бугги програма,
а онда ћемо ићи као група преко ГДБ, па ћемо видети шта можемо да урадимо да поправимо ове програме,
или да се барем идентификују шта се дешава лоше у сваком од њих.
Почнимо овде са Данила. Хоћеш ли покренути бугги1? Хајде да видимо шта се дешава.
[Данијел] Она каже да је апликација грешка. >> Да. Управо тако.
Дакле, ако сам покренути бугги1, ја добијем СЕГ грешку.
У овом тренутку, могао сам да одем и отвори бугги1.ц,
покуша да схвати шта се дешава у реду,
али један од најважнијих ствари неподношљив о овом сегменту грешке грешке
је да вас не кажем шта линија програма ствари заиста пошло наопако и поломио.
Некако морате да погледате кода
и схватити користећи погоди и проверите или принтф да види шта се дешава у реду.
Једна од најбољих ствари о ГДБ је да је стварно лако
да схватим линију на којој ваш програм сруши.
То је потпуно вреди да га користи, чак и ако је само због тога.
Тако да подигне ГДБ, куцам ГДБ, а онда сам му дати путању до програма којег желим да бежим.
Ево куцам ГДБ ./бугги1.
Хит Ентер. Даје ми све ове информације ауторских права,
и овде ћете видети ову линију која гласи: "Читање симболе из / хоме /
јхарвард/сецтион5/бугги1. "
И ако све иде добро, видећете да одштампате поруку која изгледа овако.
То ће прочитати симболе, то ће рећи "Ја читам симболе из извршну датотеку"
а онда ће се овај "урадио" поруку овде.
Ако видите неку другу варијанту ово, или видиш да није могао да пронађе симболе
или нешто слично, што значи да сте управо нису саставили исправно своју извршну.
Када смо саставити програме за коришћење са ГДБ, морамо да користимо тај специјалне г заставу,
и то је урадио по дефаулту ако компајлирање програма, само куцањем направити
или да луд или да се опорави, било од њих.
Али, ако сте ручно састављање са кланг, онда ћете морати да иде у, а укључују да-г заставу.
>> У овом тренутку, сада када имамо ГДБ за унос,
то је прилично једноставно да покренете програм.
Можемо да упишете вожњу, или можемо да Типе Р.
Већина ГДБ команде може бити скраћен.
Обично на само један или пар слова, што је прилично лепо.
Дакле Саад, ако откуцате Р и ударио Ентер, шта се дешава?
[Саад] Имам СИГСЕГВ, сегментација грешка и онда се све то Гоббледигоок.
>> Да.
Као што видимо на екрану сада, и као Саад рекао,
када куцамо серију или Р и ударио Ентер, ми смо још увек добити исту грешку сек.
Дакле, коришћењем ГДБ не решава наш проблем.
Али то нам даје неку Гоббледигоок, и испоставило се да је то Гоббледигоок
стварно нам каже где се то дешава.
Да рашчланити ово мало, ово први бит је функција у којој све иде наопако.
Постоји тај __ стрцмп_ссе4_2, и то нам говори да се то дешава у овом фајлу
позвао сисдепс/и386, све то, опет, нека врста збрке - али линија 254.
То је врста тешко рашчланити. Обично када видите ствари овако,
то значи да је то сег Фаултинг у једном од система библиотека.
Тако нешто са стрцмп. Ви сте видели стрцмп раније.
Није превише лудо, али да ли то значи да стрцмп сломљена или да постоји проблем са стрцмп?
Шта ти мислиш, Александра?
[Александар] Да ли је то - је 254 линија? И - не бинарни, али то није њихова плафони,
а онда је један језик за сваку функцију. Да ли је то 254 у тој функцији, или -?
>> То је линија 254. Изгледа као у овом фајлу. С, тако да је монтажа код вероватно.
>> Али, претпостављам хитније ствар је, јер смо стечен СЕГ грешку,
и изгледа као да долази из стрцмп функције,
да ли то значи, онда, да стрцмп је сломљен?
То не би требало, надам се. Дакле, само зато што имате сегментирања грешку
у једној од функција система, обично то значи да сте управо не зове исправно.
Најбржи ствар да схватим шта се заправо дешава
када видите нешто лудо овако, кад видиш СЕГ грешку,
нарочито ако имате програм који је користећи више него само главни,
је да се користи Бацктраце.
Ја скратим Бацктраце писањем Бт, насупрот целе речи Бацктраце.
Али Шарлота, шта се дешава када откуцате БТ и притисните Ентер?
[Шарлот] То ми показује две линије, линија 0 и 1 ред.
>> Да. Дакле, линија 0 и 1 ред.
То су стварни стек оквири који су тренутно у игри када ваш програм срушио.
Полазећи од највишег оквира, оквира 0 и иде до дна највише, што је рам 1.
Наш највиши оквир је стрцмп оквир.
Можете мислити о овоме као сличан том проблему смо само радили на квизу са показивачима,
где смо заменили оквир стека на врху главног стек оквира,
и ми смо имали променљиве које своп је користе на врху варијабли које главни је користе.
Овде је наша несрећа се десило у нашем стрцмп функцији, која је добила наша основна функција,
и повратно праћење нам даје не само функције у којима се ствари пропале,
али то нам говори где је све звао из.
Дакле, ако сам помицати по мало више на десно,
можемо видети да, да, ми смо били на линији 254 овог стрцмп-ссе4.с фајлу.
Али позив је направљен на бугги1.ц, линије 6.
Значи можемо да урадимо - је можемо само да проверим и видим шта се дешава
у бугги1.ц, линије 6.
Опет, постоји неколико начина да се то уради. Један је да изађете из ГДБ
или имају ваш код отворити у другом прозору и цросс референце.
То, само по себи, је прилично згодан, јер сада ако сте на радног времена
а ти имаш СЕГ грешку и ваш ТФ је питате где је све било разбијање,
можете само рећи: "Ох, линија 6 Ја не знам шта се дешава.,
али нешто о линији 6 изазива мој програм да се пробије. "
Други начин да то урадите је да можете да користите ову команду зове листа у ГДБ.
Такође можете да га скратили са л.
Дакле, ако смо погодили л, шта ми овде?
Ми смо добили гомилу чудне ствари.
Ово је стварна асемблерског кода
који је у стрцмп_ссе4_2.
Ово изгледа врста функи,
а разлог ми смо све то је зато сада,
ГДБ нас има у оквиру 0.
>> Дакле, кад год гледамо варијабле, сваки пут гледамо изворног кода,
гледамо кода који се односи на стек оквира тренутно смо унутра
Дакле, да би добио ништа смисла, морамо да
пређете на стек оквир који чини више смисла.
У овом случају, главни стек оквир би мало више смисла,
јер то је заправо код који смо писали.
Није стрцмп код.
Начин на који се креће између оквира, у овом случају, јер имамо два,
имамо 0 и 1,
радите то са горе и доле команди.
Ако сам помери један оквир,
сад сам у главном стек оквира.
Ја могу да се померим на доле да се вратим где сам био,
иди опет, идите опет доле, и иди поново.
Ако сте икада урадити свој програм у ГДБ, добијате судар, добићете Бацктраце,
и видећете да је у неком фајлу који не знате шта се дешава.
Пробај листа, код не изгледа познато,
погледамо своје оквире и схватити где си.
Ти си вероватно у погрешном стек оквира.
Или барем да сте у стек оквира који није онај који заиста можете дебуг.
Сада када смо у одговарајућем стек оквира, ми смо у главни,
сада можемо користити команду листу да схватим шта је била линија.
И можете видети, то је штампан за нас овде.
Али можемо погодио навести све исто, и лист нам даје овај леп испис
стварног изворног кода који се дешава овде.
>> Конкретно, можемо да погледамо на линији 6.
Можемо видети шта се дешава овде.
И изгледа као да правиш стринг поређења
између стринг "ЦС50 стена" и аргв [1].
Нешто о томе је пад система.
Па Мисси, да ли имате било какве мисли о томе шта би се могло дешава овде?
[Мисси] Ја не знам зашто је то пад система. >> Не знам зашто се то пада?
Џими, све мисли?
[Џими] Нисам потпуно сигуран, али последњи пут користили смо низ поређења,
или стрцмп, имали смо као три различита случаја под њега.
Нисмо имали ==, ја не мислим, у праву у том првом реду.
Уместо да је подељена на три, а један је био == 0,
један је <0, ја мислим, и један је> 0.
Можда тако нешто? >> Да. Тако да је ово питање
од радимо исправно поређење?
Стелла? Било која мисли?
[Стелла] Нисам сигуран. >> Нисам сигуран. Данијел? Мисли? Ок.
Испоставило се шта се дешава овде је када смо водили програм
и ми смо добили СЕГ грешку, када сте покренули програм за први пут, Даниел
Да ли сте му дати неке аргументе командне линије?
[Данијел] Но >> Но У том случају, оно што је вредност аргв [1]?
>> Нема вредност. >> Реду.
Па, не постоји одговарајућа вредност ниске.
Али, постоји нека вредност. Која је вредност која добија складишти тамо?
>> Смеће вредност? >> Или је смеће вредност или, у овом случају,
крај аргв низа увек престаје нулл.
Дакле, шта се заправо добио чувају тамо је нулл.
Други начин да се реши ово, уместо да размишља кроз,
је да покушамо штампа га.
Ово је место где сам рекао да је коришћење ГДБ је супер,
јер можете одштампати све променљиве, све вредности које желите
Коришћењем овог згодан-кицошки стр команду.
Дакле, ако укуцамо П и онда сам упишите вредност променљиве или име променљиве,
рецимо, аргц, видим да је аргц 1.
Ако желим да одштампате аргв [0], ја могу то да урадим само тако.
И као што смо видели, аргв [0] је увек име програма,
Увек име извршне.
Овде можете видети да има пуну путању.
Такође можете да одштампате аргв [1] и види шта се дешава.
>> Овде имамо ту врсту мистичног вредности.
Имамо ову 0к0.
Запамтите, на почетку мандата, када смо разговарали о хексадецималних бројева?
Или да мало питање на крају псет 0 о томе како да заступа 50 у хек?
Начин пишемо хексадецималне бројеве у ЦС, само да се не мешају се
са децимални бројеви, је да смо их увек префикс са 0к.
Дакле, ово 0к префикс увек само значи тумачи на следећи број као хексадецимални број,
не као стринг, не као децимални број, а не као бинарни број.
Пошто број 5-0 је важећи број у хексадецимални.
И то је број у децималном, 50.
Дакле, ово је само колико смо дисамбигуате.
Дакле, 0к0 значи хексадецимално 0, што је такође децимално 0, бинарна 0.
То је само вредност 0.
Испоставило се да је то оно нула је, заправо, у меморији.
Нула је само 0.
Овде елеменат чувати на аргв [1] је нулл.
Дакле, ми покушавамо да упоредите нашу "ЦС50 стена" стринг са нултом ниске.
Дакле дереференцинг ништавним, покушавајући да приступите ствари на нулл,
они су обично ће изазвати неку врсту сегментације квара или других лоших ствари које могу да се догоде.
И испада да стрцмп не проверава да види
без обзира да ли или не сте прошли у вредности која је нула.
Уместо тога, она само иде напред, покушава да уради свој посао,
и ако сег недостатке, она сег грешке, и то је твој проблем. Мораш да идеш поправити.
Стварно брзо, како бисмо решили овај проблем? Цхарлотте?
[Шарлот] Можете да проверите да ли користите.
Дакле, ако аргв [1] је нула, == 0, а затим се вратите 1, или нешто [неразумљиво].
>> Да. Дакле, то је један сјајан начин да се то уради, јер можемо проверити да видимо,
вредност ћемо ускоро да пређе у стрцмп, аргв [1], зар нулл?
Ако је нула, онда можемо рећи реду, прекини.
>> Чешћи начин да то урадите је да користите аргц вредност.
Можете видети овде на почетку главног,
изостављен тај први тест смо да смо обично радим кад користимо аргументе командне линије,
а то је да утврди да ли или не наша аргц вредност је оно што смо очекивали.
У овом случају, ми очекујемо најмање два аргумента,
назив програма плус један другог.
Зато смо о томе да користе други аргумент овде.
Дакле, имајући пре неку врсту теста, пре нашег разговора стрцмп
да тестови или не аргв је најмање 2, такође би урадио исту врсту ствари.
Можемо ли да функционише тако што ћете покренути програм поново.
Увек можете поново покренути програм у ГДБ, што је заиста лепо.
Можете да покренете, а када прође у аргументима вашем програму,
их прође када покренете позив, а не када се подигне ГДБ.
На тај начин можете да задржите позивајући свој програм са различитим аргументима сваки пут.
Тако трчите, или опет, могу Типе Р, и да видимо шта ће се десити ако откуцате "здраво".
Увек ће вас питати да ли желите да га покренете из почетка.
Обично, ти не желиш да крене од почетка.
И у овом тренутку, то рестартује поново, он исписује
програм који трчимо, бугги1, са аргументом хелло,
и штампа ову стандардну оут, она каже, "Добићете Д", тужно лице.
Али ми нисмо сег грешку. Он је рекао да је процес изашао нормално.
Тако да изгледа прилично добро.
Нема више сец крив, ми смо направили је прошлост,
тако да изгледа као да је заиста крив сец буба које смо добијали.
Нажалост, то нам говори да смо добијање Д.
>> Можемо да идемо уназад и погледамо кода и видим шта се тамо дешава
да схватим шта је било - зашто нам је говорио да смо добили Д.
Хајде да видимо, овде је ова иф каже да имаш Д.
Ако куцамо списак, као што чувате куцате листу, држи итератинг доле кроз свој програм,
тако да ћу вам показати неколико првих редова вашем програму.
Онда ћу вам показати наредних неколико линија, а следећи комад и следећи комад.
И то ћемо наставити да покушава да иде доле.
И сада ћемо доћи до "построје број 16 је ван опсега."
Јер има само 15 линија.
Ако дођете до ове тачке и ваше питају: "Шта да радим?" можете користити команду помоћи.
Користите помоћ и онда дајте му име команде.
И видиш ГДБ нам даје све овакве ствари.
Он каже, "без аргумената, наводи још десет линије после или око претходном попису.
Списак - набраја десет линија раније - "
Дакле, хајде да покушамо помоћу листе минус.
И да су наведени 10 линија претходна, можете се играти са листом мало.
То можете да урадите листу, листу -, можете чак дати наведете број, као што је листа 8,
и то ће навести 10 линија око линији 8.
И можете видети шта се дешава овде имате једноставан ако другде.
Ако укуцате ЦС50 стене, исписује "Добијате А."
Иначе штампа "Добићете Д."
Штета град. У реду. Да?
>> [Данијел] Дакле, када сам покушао радим ЦС50 стене без наводника,
пише "Добићете Д."
Морао сам на цитате да се то да раде, зашто је то тако?
>> Да. Испада да када - ово је још једна забавно мало малчице -
Када покренете програм, ако га покрене и куцамо на ЦС50 стенама,
баш као Данијел је рекао да јесте, а ти ударио Ентер,
ипак каже да смо добили Д.
А питање је, зашто је ово?
И испоставило се да су оба наша терминал и ГДБ рашчланити их као две засебне аргумената.
Јер када постоји простор, који је подразумевао и
Први аргумент завршен, следећи аргумент о томе да почне.
Начин да се комбинују оне у две или извини, у један аргумент,
је да користите наводнике.
Па сад, ако смо га ставили у наводнике и покрените га поново, добијамо А.
Дакле, само да подсетимо, нема цитира, ЦС50 и стене се анализирати као две одвојене аргумената.
Са наводницима, то је анализирати као један аргумент уопште.
>> То се може видети са Бреакпоинт.
До сада смо били покренут наш програм, и то је био покренут
све док се она сег грешке или Хитс грешку
или док је изашао и све је потпуно у реду.
Ово није нужно најкорисније ствар, јер понекад
имаш грешку у свом програму, али то није то изазива сегментирања грешку.
Није изазива ваш програм да заустави или нешто слично томе.
Начин да се ГДБ да паузирате ваш програм у одређеном тренутку
је да поставите тачку прекида.
Можете да урадите постављањем тачку прекида на име функције
или можете да подесите тачку прекида на одређеном линију кода.
Волим да подесите тачке прекида на имена функција, јер - лако за памћење,
и ако сте заиста тамо и промените свој изворни код се мало,
онда се ваш Бреакпоинт ће заправо остати на истом месту у вашем коду.
Док ако користите линије бројева, и ресорна мењају и бројеви
зато што додате или избришете неки код, а затим ваше тачке прекида су сви тотално зезнуо.
Једна од најчешћих ствари које ја радим је поставити тачку прекида на основну функцију.
Често ћу подигне ГДБ, ја ћу тип Б маин, притисните Ентер, и да ћу поставити тачку прекида
на главном функцијом која само каже: "Зауставите програм чим почну да се приказују"
и на тај начин, када сам се покрећу свој програм са, рецимо, ЦС50 стена као два аргумента
и ударио Ентер, она добија на главну функцију, а завршава на први ред,
пре него што се оцењује стрцмп функцију.
>> Пошто сам застао, сада могу зачепркате около и видим шта се дешава
са свим различитих варијабли које су прошли у свом програму.
Овде сам да одштампате аргц и види шта се дешава.
Видите да је аргц је 3, јер има 3 различите вредности у њему.
То је добио име програма, она је добила први аргумент и други аргумент.
Можемо штампати оне од стране гледајући аргв [0], аргв [1], и аргв [2].
Тако сада можете видети зашто је ово стрцмп позив ће да пропадне,
јер видиш да ли поделити ЦС50 и стене у две одвојене аргумената.
У овом тренутку, када сте ударио тачку прекида, можете наставити да прођете кроз свој програм
ред по ред, насупрот почиње поново програм.
Дакле, ако не желите да покренете програм поново и само наставите даље одавде,
можете користити команду наставити и даље ће радити програм до краја.
Баш као што је то овде урадио.
Међутим, ако сам поново покрените програм, ЦС50 стена, она погоди опет мој тачку прекида,
и овај пут, ако ја не желим само да одем скроз кроз остатак програма,
Ја могу да користе следећу команду, што сам и скратили са н.
И ово ће корак кроз програм линију по линију.
Дакле, можете гледати како ствари извршавају, као променљиве промене, како ствари се ажурира.
Који је прилично лепо.
Друга ствар је кул него понављајући исту команду изнова и изнова и изнова,
ако само притисните Ентер - ево видиш ја нисам откуцао у чему -
ако сам ударио Ентер, то ће поновити претходну команду,
или претходни ГДБ команда која сам ставио унутра
Могу да ударају Ентер и то ће задржати корак кроз мој код линију по линију.
Ја бих охрабрити ви да идете проверите остале програме Бугги као добро.
Ми немамо времена да се кроз све њих данас у одељку.
Изворни код је тамо, тако да можете да некако видимо шта се дешава
иза сцене ако се стварно заглави,
али у најмању руку, само вежбају бутовања ГДБ,
покретања програма све док се не сломи на тебе,
добијање Бацктраце, схватите шта функционишу судар је био у,
шта је линија на, штампање неке променљиве вредности,
само тако да добију осећај за то, јер то ће заиста помоћи да иде напред.
У овом тренутку, ми ћемо престати из ГДБ, коју не користите отказ или само К.
Ако је ваш програм је усред трчања, ипак, и није узбуђена,
увек ће вас питати: "Јесте ли сигурни да заиста желите да изађете?"
Можете само да удари.
>> Сада ћемо да погледамо следећи проблем који имамо, а то је мачка програма.
Ако гледате краткорочно на преусмерава и цеви, видећете да је Томми користи овај програм
да у основи штампа све излаз датотеке на екрану.
Дакле, ако сам покренути мачку, ово је заправо уграђен у програм апарата,
и ако имате Мац можете да урадите ово на вашем Мац превише, ако отворите терминал.
А ми - мачка, рецимо, цп.ц и притисните Ентер.
Шта то урадио, ако помицати се мало и погледајте где смо трчали линију,
или где смо водили мачку команду, то је само буквално штампа садржај цп.ц нашем екрану.
Можемо га покренути поново и можете ставити у више фајлова заједно.
Дакле, можете да урадите цп.ц мачку, а онда можемо повезати у облику ланца и цат.ц фајл,
који је програмски смо о томе да пишем,
и то ће штампати обе датотеке бацк то бацк на нашим екранима.
Дакле, ако смо помицати се мало, видимо да када смо трчали ову мачку цп.ц, цат.ц,
прво штампају цп датотеку, а затим испод њега, он одштампан на цат.ц фајл право доле.
Ми ћемо користити ову добити само наше ноге мокро.
Играјте се са једноставним штампањем на терминалу, погледајте како то ради.
Ако ви отворите са гедит цат.ц, притисните Ентер,
можете видети програм који ћемо ускоро писати.
Ми смо укључили ову лепу котла тањир, тако да не морате да трошите време куцање све то.
Такође проверите број аргумената донет унутра
Ми смо одштампали леп коришћења поруку.
>> Ово је једна од оних ствари које, опет, као да смо говорили,
то је скоро као мишића меморије.
Само запамтите да раде исту врсту ствари
и увек штампање некакав користан поруке
тако да људи знају како да покренете свој програм.
Са мачком, то је прилично једноставан, ми смо само ћемо да прођемо кроз све различите аргументе
који су прошли на нашем програму, а ми ћемо да одштампате
њихов садржај ван на екрану једном у једном тренутку.
У циљу да штампате датотеке до екрана, идемо да урадимо нешто веома слично
шта смо урадили на крају квиза.
На крају квиза, да запосли програм, морали смо да отворимо датотеку,
и онда смо морали да штампате на њему.
У овом случају, ми ћемо отворити датотеку, а ми ћемо читати из њега уместо.
Онда ћемо да штампате, уместо у фајлу, идемо да штампате на екрану.
Дакле, штампа на екран сви сте урадили раније са принтф.
Дакле, то није превише луда.
Али читање датотеке је некако чудно.
Ми ћемо проћи кроз то мало у исто време.
Ако ви вратите се на том последњем проблему на квизу, проблем 33,
Прва линија која ћемо овде радити, отварање датотеке, је веома сличан ономе што смо тамо урадили.
Па Стела, шта та линија да изгледа, када смо отворили слику?
[Стелла] Капитал ФИЛЕ * датотека - >> реду. >> - Једнака фопен. >> Аха.
Која је у овом случају? То је у коментару.
>> То је у коментару? аргв [и] и Р?
>> Тачно. Право на. Дакле, Стела је потпуно у праву.
То је оно што линија изгледа.
Ми ћемо добити променљиву датотеке стреам, чувајте га на ФИЛЕ *, тако да су сви поклопци,
ФИЛЕ, *, и име овог променљиве ће бити датотека.
Могли би га назвати год хоћемо. Могли назвати фирст_филе или филе_и, шта год желите.
А онда име фајла донет на командној линији до овог програма.
Дакле, то је ускладиштена у аргв [и,] и онда ћемо отворити овај фајл у прочитао режиму.
Сада када смо отворили датотеку, шта је оно што увек морамо да се сетите да урадите
кад смо отворили датотеку? Затворите га.
Па Мисси, како смо затворили датотеку?
[Мисси] фцлосе (датотека) >> фцлосе (датотека). Управо тако.
Сјајно. Ок. Ако гледамо на то да коментар овде,
каже, "Отвори аргв [и] и штампају своје садржаје на стдоут."
>> Стандардни излаз је чудно име. Стдоут је само наш начин да се каже
желимо да га одштампате на терминал, ми желимо да га одштампате на стандардни ток излаз.
Ми заправо можемо отарасити овог коментара овде.
Ја ћу да га копирате и налепите га, јер то је оно што смо урадили.
У овом тренутку, сада морамо да прочита мало по мало датотеке.
Смо разговарали смо неколико начина читања фајлова.
Које су ваше омиљене до сада?
Који начини сте видели или да ли се сећате, да чита фајлове?
[Данијел] фреад? >> Фреад? Дакле фреад је један. Џими, знаш ли неке друге?
[Џими] Но >> реду. Јок. Цхарлотте? Алекандер? Било остали? Ок.
Дакле они други су фгетц, један је да ћемо користити много.
Ту је фсцанф; ви погледајте овде шаблон?
Сви они почињу са ф. Ништа са датотеком.
Има фреад, фгетц, фсцанф. То су све читање функција.
За писање имамо фврите, имамо фпутц уместо фгетц.
Такође смо желели иф смо видели на квизу.
Пошто је ово проблем који укључује читање из датотеке,
ћемо користити једну од ове три функције.
Нећемо да користите ове функције овде доле.
Ове функције се све наћи у стандардној И / О библиотеке.
Дакле, ако се осврнемо на врху овог програма,
можете видети да смо већ били су заглавља фајл за стандардне И / О библиотеке.
Ако желимо да сазнате који желимо да користимо,
увек можемо отворити странице ман.
Дакле, можемо откуцати стдио ман
и прочитајте све о стдио улазних и излазних функција у Ц
И већ можемо видети Ох, погледај. То је напоменути фгетц, то је поменути фпутц.
Тако можете уронити мало и погледајте, рецимо, фгетц
и погледај на свом ман страници.
Можете видети да иде заједно са целом гомилом других функција:
фгетц, фгетс, гетц, гетцхар, добија, унгетц и њен унос карактера и гудаче.
Дакле, ово је како читамо у ликовима и гудаче од фајлова са стандардног улаза,
која је у суштини од корисника.
А ово је како то радимо у стварном Ц.
Дакле, ово не користи ГетСтринг и гетцхар функције
које смо користили из ЦС50 библиотеке.
Ми ћемо да урадимо овај проблем у неколико начина
тако да можете да видите две различите начине то ради.
Оба фреад функција која Данијел помиње и фгетц су добри начини да се то уради.
Мислим фгетц је мало лакше, јер има само, као што видите,
један аргумент, ФИЛЕ * да ми покушавамо да чита карактер из,
а његова вредност је повратак инт.
А ово је мало збуњујуће, зар не?
>> Јер ми смо све карактер, па зашто не овај повратак знак?
Ви имате идеју о томе зашто ово не може да врати карактер?
[Мисси одговори, неразумљиво] >> Да. Дакле, Миси је потпуно у праву.
Ако је АСЦИИ, онда цео могло бити мапирани на стварну знак.
Може бити АСЦИИ знак, и то је у реду.
То је управо оно што се дешава.
Ми користите инт једноставно зато што има више бита.
То је већи него знак, наш карактер има само 8 битова, да је 1 бајт на нашим 32-битним машинама.
И инт има вредност свих 4 бајта "простора.
И испоставило се да је начин на који фгетц ради,
ако идите доле у ​​нашој синопсису у овој ман страници мало,
помицати скроз доле. Испоставило се да они користе ову посебну вредност зове ЕОФ.
То је посебна стална као повратну вредност функције фгетц
кад си ударио крај датотеке или ако добијете грешку.
И испада да се уради ове поређења са ЕОФ правилно,
желите да имате тај додатни количину информација које имате у инт
насупрот помоћу цхар променљиву.
Иако фгетц ефикасно добија карактер из фајла,
желите да запамтите да се враћа нешто што је типа инт вама.
То је рекао, то је прилично једноставан за коришћење.
То ће нам дати карактер, па све што треба да урадимо је да стално постављају фајл,
"Дај ми следећи карактер, дајте ми следећи карактер, дајте ми следећи карактер"
док не стигнемо до краја датотеке.
И да ће се повући у једном лику у једном тренутку из наше фајла,
и онда можемо да радимо шта год желите са њим.
Можемо га сачувате, можемо га додати у низу, можемо га одштампате.
Да ли неко од тога.
>> Зумирање назад напоље и да се вратимо на наш цат.ц програма,
ако ћемо користити фгетц,
како бисмо могли приступити овај следећи линију кода?
Ми ћемо користити - фреад ће урадити нешто мало другачије.
И овај пут, ми ћемо само користити фгетц да један карактер у једном тренутку.
Да бисмо обрадили цео фајл, шта би ми морамо да радимо?
Колико ликови постоје у датотеци?
Постоји много. Дакле, вероватно желите да се један
и онда се још и добити још и добити другу.
Какав алгоритма мислите можда ћемо морати да овде користите?
Који тип -? [Александар] за петљу? >> Тачно.
Неки тип петље.
Фор петља је заправо велика, у овом случају.
И као што си рекао, то звучи као да желите петљу над целом датотеком,
добијање карактер на време.
Свака сугестија на шта би то могло изгледати?
[Александар, неразумљив]
>> Ок, само ми реци на енглеском оно што покушавате да урадите? [Александар, неразумљив]
Дакле, у овом случају, то звучи као да ми само покушавамо да петљи преко целе датотеке.
[Александар] Тако сам <величина инт? >> Величина -?
Претпостављам величину датотеке, зар не? Величина - ве'лл само пишите га овако.
Величина датотеке за сада, и + +.
Тако испада да је начин на који то радите помоћу фгетц, а ово је ново,
је да не постоји лак начин да се само добити величину датотеке
са овим "сизеоф" типа изгради који сте видели раније.
Када смо користили ту функцију фгетц, ми увођење неке врсте
нови, фанки синтакса да ово петље, где уместо користећи само основну бројач
ићи карактер по карактер, ми ћемо повући један карактер у једном тренутку,
један знак у времену, и начин на који знамо да смо на крају
не, када смо рачунали одређени број знакова,
али када смо карактер извући јесте да је посебна крај датотеке карактера.
Дакле, можемо да урадимо ово - Ја ово зовем кан, а ми ћемо га покрене
са нашом првом позиву да добије први карактер из фајла.
Дакле, овај део овде, ово ће да добије карактер из фајла
и чувајте га у променљиву цх.
Ми ћемо да радимо све док не дођемо до краја фајла,
што радимо тестирањем за лик не сме бити једнака тој посебног карактера ЕОФ.
И онда уместо да ради ЦХ + +, који би само повећао вредност,
па ако прочитате А из фајла, капитала, рецимо,
цх + + би нам б, а онда бисмо добили ц и затим д.
То свакако није оно што ми желимо. Оно што овде желимо
У овом последњем мало је желимо да добијемо следећи карактер из фајла.
>> Па како бисмо добили следећи карактер из фајла?
Како смо добили први карактер из фајла?
[Студентски] фгетфиле? >> Фгетц, или, извини, ти си потпуно у праву.
Ја га погрешно тамо. Тако да.
Ево уместо да ради ЦХ + +
ми ћемо само да позовем фгетц (фајл) поново
и чувајте резултат у нашој истом цх променљиве.
[Студентски питање, неразумљив]
>> Ово је место где су ови момци филе * су посебни.
Начин на који они раде они је - када први пут отворите - када сте први пут да тај фопен позив,
Тхе филе * ефикасно служи као показивач на почетак фајла.
И онда сваки пут кад зовем фгетц, креће се један карактер кроз фајл.
Дакле, кад год зовем, ти увецава датотеке показивач један карактер.
А када поново фгетц, ви га креће други карактер
и још један лик и други карактер и још један лик.
[Студентски питање, неразумљиво] >> А то је - да.
То је врста ове магије испод хаубе.
Само настави увецава кроз.
У овом тренутку, ви сте у стању да се заиста ради са карактером.
Па како бисмо одштампате ово на екрану, сада?
Можемо користити исту ствар принтф које смо користили раније.
То смо користили све семестар.
Можемо принтф позива,
и можемо проћи у карактеру тек тако.
Други начин да то урадите је да уместо коришћења принтф и потребе да се уради овај стринг формат,
такође можете да користите неку од других функција.
Можемо користити фпутц, који штампа карактер на екрану,
осим ако гледамо фпутц - дозволите ми да умањите мало.
Ми видимо шта је лепо је то потребно у карактеру који смо прочитали користите фгетц,
али онда морамо да га дају ток за штампање на.
Такође можете да користите путцхар функцију која ће директно ставити на стандардну напоље.
Дакле, постоји гомила различитих опција које можемо користити за штампање.
Они су сви у стандардној И / О библиотеке.
Кад год желите да одштампате - тако иф, подразумевано ће штампати на посебан стандард од потока,
а то је да стдоут.
Дакле, можемо само да се односи на њега као вид ове магичне вредности, стдоут овде.
Упс. Стави зарез испред.
>> То је много новог, фанки информација овде.
Много тога је веома идиоматски, у смислу да је то код
који је написан на овај начин само зато што је чист да чита, лако за читање.
Постоји много различитих начина да се то уради, много различитих функција које можете користити,
али смо склони да само пратите ове исте обрасце изнова и изнова.
Дакле, немојте се изненадити ако видиш код овако долази поново и поново.
У реду. У овом тренутку, морамо да се пробије на дан.
Хвала што си дошао. Хвала за гледање ако сте на мрежи. И ми видимо следеће недеље.
[ЦС50.ТВ]