[Powered by Google Translate] [Филе И / О]
[Џејсон Хирсцххорн, Универзитет Харвард]
[Ово је ЦС50, ЦС50.ТВ]
Када мислимо о фајлу, што нам пада на памет је Мицрософт Ворд документ,
ЈПЕГ слика, или МП3 сонг,
и ми смо у интеракцији са сваком од ових типова фајлова у различите начине.
На пример, у Ворд документ додамо текст
док је са ЈПЕГ сликом можемо изрезати од ивице или ретуширање боје.
Ипак, под хаубом све фајлове у нашем рачунару ништа више
од дугог низа нула и јединица.
То је до специфичне апликације која у интеракцији са датотеком
да одлучи како да обрадимо ту дугу секвенцу и представити га кориснику.
С једне стране, документ може погледати само једном бајту,
или 8 нуле и јединице, као и приказивање АСЦИИ карактер на екрану.
С друге стране, растерска слика може погледати на 3 бајта,
или 24 нуле и јединице,
и тумаче их као хексадецималне бројеве 3
који представљају вредности за црвену, зелену и плаву
у један пиксел слике.
Шта год могу изгледати на екрану, у самом језгру,
фајлови нису ништа више него низ нула и јединица.
Дакле, хајде да зароните у и погледајте како заправо манипулишу овим нуле и јединице
када је у питању писање и читање из датотеке.
>> Ја ћу почети тако да се разбије на једноставан 3-дио процеса.
Даље, ја ћу зароне у два кода примера који показују ове три дела.
Коначно, ја ћу прегледати процес и неке од његових најважнијих детаља.
Као и код било ког фајла који седи на радној површини,
прва ствар коју треба да урадите је да га отвори.
У Ц радимо ово проглашење показивач на предефинисаним струцт
која представља датотеку на диску.
У овом позива функције, такође одлучити да ли желимо да пише или чита из датотеке.
Даље, ми стварно читања и писања.
Постоји низ специјализованих функција можемо користити у овом делу,
и скоро сви почињу са словом Ф, која се залаже за датотеку.
Последњи, сличан малим црвеним Кс у горњем углу датотека отворена на рачунару,
ми смо затворили датотеку са завршном позива функције.
Сада када имамо општу идеју о томе шта ћемо да урадимо,
хајдемо зароните у коду.
>> У овом регистру, имамо две Ц фајлова и њихове одговарајуће извршне датотеке.
Писаћој машини Програм траје један аргумент командне линије,
назив документа желимо да стварамо.
У овом случају, ми ћемо га зову доц.ткт.
Хајде покрените програм и унесите неколико линија.
Здраво. Моје име је Џејсон.
Коначно, ми ћемо упишите "куит".
Ако сада списак свих датотека у том именику,
видимо да нови документ постоји зове доц.ткт.
То је фајл овај програм управо креирали.
И наравно, и она није ништа више него дугог низа нула и јединица.
Ако смо отворили овај нови фајл,
видимо 3 линије кода смо ушли у наш програм -
Здраво. Мај име је Џејсон.
Али шта се заправо дешава када типевритер.ц ради?
Прва линија од интереса за нас је линија 24.
У овој линији, ми изјављујемо нашу показивач датотеке.
Функција која враћа овај показивач, фопен, узима два аргумента.
Први је име датотеке, укључујући датотеке екстензију ако је потребно.
Подсетимо се да екстензија не утиче на фајл на свом најнижем нивоу.
Ми увек имамо посла са дугом низу нула и јединица.
Али то утиче како су датотеке тумачити и које апликације користе за њихово отварање.
Други аргумент фопен је једно слово
која се залаже за оно што планирамо да урадимо када смо отворили датотеку.
Постоје три опције за овај аргумент - В, Р и А.
Одабрали смо ж у овом случају, јер желимо да пишем у датотеку.
Р, као што вероватно можете погодити, је за читање датотеке.
А је за додавање датотеке.
Иако су обе В и може да се користи за писање у фајлове,
в ће почети писање од почетка фајла
и потенцијално преписати све податке који су претходно сачуване.
По дефаулту, фајл отворимо, ако већ не постоји,
се креира у нашем садашњем радном директоријуму.
Међутим, ако желимо да приступите или направите датотеку на другој локацији,
у првом аргументу оф фопен,
можемо одредити путању датотеке поред имена датотеке.
Док је први део овог процеса је само једна линија кода дуго,
увек је добра пракса да се укључи још један скуп линија
да проверите да обезбеди да је датотека успешно отворена или креирана.
Ако фопен враћа нулл, ми не бисмо желели да крене напред са нашим програмом,
а то се може десити ако је оперативни систем без меморије
или ако покушате да отворите датотеку у директоријум за који нисмо имали одговарајуће дозволе.
>> Други део процеса одвија у вхиле петље писаћа машина је.
Ми користимо ЦС50 библиотеке функцију да би улаз од корисника,
и под претпоставком да они не желе да напусти програм,
користимо функцију фпутс да узме стринг и запишите га у датотеку.
фпутс је само једна од многих функција можемо да користимо за писање у датотеку.
Друге могу фврите, фпутц, па чак и фпринтф.
Без обзира на одређеној функцији завршимо коришћење, међутим,
сви треба да знају, преко својих аргумената,
најмање две ствари -
оно што треба да буде написан и где треба да буде написан на.
У нашем случају, улаз је стринг који треба да буде написан
и фп је показивач који нас упућује где пишемо.
У овом програму, други део процеса је прилично једноставно.
Ми једноставно узимате стринг од корисника
и да га додате директно у нашој датотеци са мало до нема улаз валидација или безбедносне провере.
Често, међутим, други део ће се највећи део кода.
Коначно, трећи део је на линији 58, где смо затворили датотеку.
Овде зовемо фцлосе и проследи је наш оригинални показивач датотеке.
У наредном реду, враћамо нула, сигнализацију крај нашег програма.
И, да, трећи део је као једноставан као тај.
>> Идемо на читање из датотеке.
Назад у нашем каталогу имамо фајл под називом принтер.ц.
Хајде да пробамо са датотеком смо управо креирали -
доц.ткт.
Овај програм, као што име сугерише, једноставно ће штампати садржај датотеке прошао на њега.
И тамо га имамо.
Линије кода смо унели раније и чувају у доц.ткт.
Здраво. Моје име је Џејсон.
Ако смо зароните у принтер.ц,
видимо да доста кода личи на оно што смо управо ушао кроз у типевритер.ц.
Заиста линија 22, где смо отворили датотеку,
и линија 39, где смо затворени фајл,
су и готово идентичне типевритер.ц, осим фопен други аргумент.
Овај пут смо читање из датотеке,
тако да смо изабрали р уместо ж.
Тако, хајде да се фокусирамо на другом делу процеса.
У складу 35, као други услов у нашој 4 петље,
смо упутили позив фгетс,
пратилац функција фпутс од раније.
Овај пут имамо три аргументе.
Први је показивач на низ знакова где ће жица бити ускладиштене.
Други је максималан број карактера који се чита.
И трећи је показивач датотеке са којима радимо.
Приметићете да је за петљу завршава када фгетс враћа нулл.
Постоје два разлога да то може да се деси.
Прво, можда је дошло до.
Друго, и још вероватније, крај датотеке је постигнут и нема више знакова су читати.
У случају да се питате, две функције не постоје које нам омогућавају да кажем
Разлог што је узрок овом нулл поинтер.
И, што није изненађујуће, јер морају да раде за рад са датотекама,
како феррор функција и функција феоф почињу са словом ф.
>> Најзад, пре него што закључимо, једно кратко обавештење о крају датотеке функције,
који је, како управо поменуо, је написан као феоф.
Често ћете се наћи користе док и петље да се прогресивно чита свој пут кроз фајлова.
Дакле, мораћете начин да оконча ове петље након што до краја ових фајлова.
Позивање феоф на фајл показивач и провере да ли је то истина
ће учинити управо то.
Тако, док се петља са условом (феоф (ФП)!) Може изгледати као савршено решење одговарајуће.
Ипак, кажу да имамо једну линију остало у нашем текстуалном фајлу.
Ми ћемо ући наш петље вхиле и све ће радити како је планирано.
На следећој рунди кроз наш програм ће проверити да ли феоф оф ФП је истина,
али - и то је кључна тачка овде разумети -
то неће бити истина само још.
То је зато што је сврха феоф није да провери
ако следећи позив на читање функција ће се појавити до краја датотеке,
већ да провери да ли је или није крај фајла је већ постигнут.
У случају овог примера,
читања последњу линију нашег фајла иде савршено глатко,
али програм још увек не зна да смо стигли до краја нашег фајла.
То није све док се не једну додатну прочитао да она бројачи краја датотеке.
Дакле, тачно стање би бити следећи:
фгетс и њене три аргументи - излаз, величине производње, и ФП -
и све то није једнако нулл.
То је приступ који смо узели у принтер.ц,
и у овом случају, после петље излаза,
могли назвати феоф или феррор да обавести корисника као специфичног образложење за излазак из ове петље.
>> Писање и читање из датотеке је, у свом најосновнијем,
једноставна 3-дио процеса.
Прво, ми смо отворили датотеку.
Друго, ми смо ставили неке ствари у нашој датотеци или да неке ствари од тога.
Треће, ми смо затворили датотеку.
Први и последњи делови су лако.
Средњи део је где лукав ствари лежи.
И мада испод хаубе смо увек имамо посла са дугом низу нула и јединица,
то не помаже када кодирање да додате слој апстракције
који претвара низ у нешто што више личи оно што смо навикли да видимо.
На пример, ако радите са 24-битном битмап фајл,
ћемо вероватно ће бити читања или писања три бајта у једном тренутку.
У том случају, било би смисла да се дефинише и адекватно име
струцт који је 3 бајта велики.
>> Мада раде са датотекама може изгледати компликован,
користи им омогућава нам да урадимо нешто заиста изузетан.
Можемо променити стање у свету изван нашег програма,
можемо створити нешто што живи изван живота нашег програма,
или можемо чак и да промените нешто што је створено раније наш програм почео да бежи.
Интеракција са фајловима је заиста моћан део програма у Ц
и ја сам узбуђен да видим шта ћеш да направите са њим у коду да дође.
Моје име је Џејсон Хирсцххорн. Ово је ЦС50.
[ЦС50.ТВ]
>> [Смех]
Ок. Један узети. Идемо.
Када размишљамо о датотеци - >> Ох, чекај. Извините.
[Смех] У реду.
Здраво.
Када мислимо датотеке -
Када мислите о фајлу - Ок. Реците ми кад сте спремни.
Ох, сјајно.
Иако читање са телоп може да изгледа - не. Моја грешка.