[Powered by Google Translate] [File I / O]
Джейсън Hirschhorn, Харвардски университет]
Това е CS50, CS50.TV]
Когато мислим за даден файл, което идва на ум е Microsoft Word документ,
JPEG изображение или MP3 песен,
и ние си взаимодействат с всеки един от тези видове файлове по различни начини.
Например, в Word документ добавите текст
докато при JPEG изображение можем да изрежете ръбовете или ретуширате цветовете.
И все пак под капака на файловете в компютъра ни не са нищо повече
от една дълга поредица от нули и единици.
Той е създаден за конкретното приложение, което взаимодейства с файла
за да се реши как да се обработва тази дълга поредица и да го предостави на потребителя.
От една страна, документ може да изглежда само един байт,
или осем нули и единици, както и показване на ASCII герой на екрана.
От друга страна, растерно изображение може да изглежда в три байта,
или 24 нули и единици,
и да ги интерпретира като три шестнадесетични числа
, които представляват стойностите за червено, зелено и синьо
в един пиксел от изображението.
Каквото и да изглежда на екрана, в същината си,
файлове не са нищо повече от поредица от нули и единици.
Така че нека да се потопите в и погледнете как ние всъщност манипулират тези нули и единици
когато става дума за писане и четене от файл.
>> Ще започна, като я счупи в обикновен процес на 3 части.
На следващо място, ще се потопите в две код примери, които показват тези три части.
И накрая, аз ще преглежда процеса и някои от най-важните детайли.
Както при всеки файл, който седи на вашия работен плот,
първото нещо, което трябва да направите, е да го отворите.
В C правим това чрез обявяване на показалеца на предварително определена структура
, която представлява файл на диска.
В тази функция разговор, ние също така да реши дали искаме да пише или да чете от файла.
На следващо място, ние правим действителното четене и писане.
Има редица специализирани функции, можем да използваме в тази част,
и почти всички от тях започват с буквата F, която стои за файла.
На последно място, близко до малките червени Х в горния ъгъл на файловете отвори на вашия компютър,
затворете файла с окончателен извикване на функция.
Сега, когато имаме обща представа за това, което ще направим,
да се потопите в кода.
>> В тази директория, имаме две C файлове и съответните им изпълними файлове.
Пишеща машина програмата приема само един аргумент на командния ред,
името на документа, искаме да създадем.
В този случай, ние ще се обадя го doc.txt.
Нека стартирате програмата и въведете няколко реда.
Здравейте. Моето име е Джейсън.
И накрая, ние ще напишете "напусна."
Ако сега се изброят всички файлове в тази директория,
ние виждаме, че съществува нов документ, наречен doc.txt.
Това е файла току-що създадената тази програма.
И разбира се, това също е нищо повече от една дълга поредица от нули и единици.
Ако отворим този нов файл,
ние виждаме три реда код, за да влезе в нашата програма -
Здравейте. Май име е Джейсън.
Но какво всъщност се случва, когато typewriter.c работи?
На първия ред на интерес за нас е линия 24.
В този ред, ние заявяваме нашата файлов указател.
Функция, която връща този указател, fopen, отнема два аргумента.
Първата е името на файла, включително разширението на файла ако е необходимо.
Спомнете си, че разширението на файла не влияе върху файла на най-ниското си ниво.
Ние винаги се занимават с една дълга поредица от нули и единици.
Но тя не влияят на файлове се тълкува и какви приложения се използват, за да ги отворите.
Вторият аргумент на fopen е една буква
, който стои за това, което планираме да направим, след като отворите файла.
Има три варианта за този аргумент - W, R, и А.
Избрали сме w в този случай, защото искаме да пишете на файла.
R, както вероятно можете да се досетите, е за четене на файл.
И за добавяне на файл.
Докато w, така и може да се използва за писане за файлове,
w ще започне писмена форма от началото на файла
и потенциално да пренапише всички данни, които преди това са били съхранявани.
По подразбиране, файлът се отвори, ако тя вече не съществува,
е създадена в нашето настояще работна директория.
Въпреки това, ако искаме да има достъп или да създадете файл на различно място,
в първия аргумент на fopen
ние може да определи пътя на файла, в допълнение към името на файла.
Докато първата част на този процес е само един ред код отдавна,
тя винаги е добра практика да се включи друг набор от линии
тази проверка, за да се гарантира, че файлът е успешно отворен или създадени.
Ако fopen връща нула, ние не би искал да продължи напред с нашата програма,
и това може да се случи, ако операционната система е на паметта
или ако се опитате да отворите файл в директория, за които ние не разполагаме с правилните разрешения.
>> Втора част на процеса се извършва в линия, докато на пишеща машина.
Ние използваме CS50 библиотека функция, за да получите вход от потребителя,
и да се предположи, те не искат да се откажат от програмата,
използвате функцията fputs да вземе низ и го напиша файла.
fputs е само една от многото функции бихме могли да използваме, за да пишете на файла.
Други включват неуспешно, fputc и дори fprintf.
Независимо от конкретна функция в крайна сметка се използват, обаче,
всички от тях трябва да знаете, чрез своите аргументи,
най-малко две неща -
това, което трябва да бъде написана и къде трябва да бъде написана.
В нашия случай, входът е низ, който трябва да бъде написана
и РП е указател, който ни насочва към пишем.
В тази програма, втората част на процеса е доста ясна.
Ние сме просто низ от потребителя
и да го добавите директно в нашия файл с малко да не валидиране или въвеждане на проверки на сигурността.
Често, обаче, втората част ще поеме по-голямата част от кода си.
И накрая, третата част е по линия 58, където ние затворете файла.
Тук ние наричаме неуспешно и да го предадат нашия оригинален файлов указател.
В последвалата линия, връщаме нула, сигнал за края на нашата програма.
И, да, трета част е толкова просто.
>> Нека продължим за четене от файлове.
Обратно в нашия каталог имаме файл, наречен printer.c.
Да го изпълним с файл, който току-що създадената
doc.txt.
Тази програма, както подсказва и името, просто ще отпечатате съдържанието на файла премина към него.
И там ние я имаме.
Реда код бяхме написали по-рано и записват в doc.txt.
Здравейте. Моето име е Джейсън.
Ако се гмуркаме в printer.c,
ние виждаме, че много на кода изглежда подобно на това, което току-що влезе през typewriter.c.
Всъщност ред 22, където отвори папката,
и линия 39, където е прекратила преписката,
и двете са почти идентични с typewriter.c, освен за fopen втория аргумент.
Този път, четем от файл,
така че сме избрали R вместо w.
Така, нека се съсредоточим върху втората част на процеса.
През линия 35, като второто условие в нашата 4 контур,
осъществите повикване до fgets,
спътник функция, за да fputs от преди.
Този път имаме три аргумента.
Първият е указател към масив от символи, където ще бъдат съхранявани низ.
Вторият е максималния брой символи, да се чете.
И третото е показалеца на файла, с които ние работим.
Ще забележите, че за цикъла приключва, когато fgets връща нула.
Има два причина, че това може да се случи.
Първо, вероятно е възникнала грешка.
Второ, и по-вероятно, в края на файла е постигнато и не повече герои са прочели.
В случай, че се чудите, не съществуват две функции, които ни позволяват да се каже
поради което е причината за този конкретен показалеца нула.
И не е изненада, тъй като те трябва да се направи с работа с файлове,
както ferror функция и функцията feof началото с буквата F.
>> Накрая, преди да се стигне до извода, един бърз бележка за края на файла функция,
които, както току-що споменах, е написано като feof.
Често ще се намери време и за вериги постепенно да чете вашия начин чрез файлове.
По този начин, вие ще се нуждаят от начин да се сложи край на тези вериги, след като стигнат до края на тези файлове.
Разговори feof на вашия файл показалеца и проверка, за да се види дали е вярно
ще направи точно това.
По този начин, докато контур с условието (! Feof (FP)) може да изглежда като напълно подходящо решение.
Въпреки това, казват, че имаме един ред в нашата текстов файл.
Ние ще влезе в нашия цикъл, докато и всичко ще работи, както е планирано.
В следващия кръг чрез нашата програма ще провери за да видите ако feof на РП е вярно,
но - и това е критичната точка, за да се разбере тук -
тя няма да е вярно, просто все още.
Това е, защото целта на feof не е да се провери
ако следващото обаждане за четене функция ще се появи в края на файла,
, а по-скоро да се провери дали не е достигнат края на файла.
В случай на този пример,
четене на последния ред на нашия файл върви идеално гладко,
но програмата все още не знае, че сме хит на края на нашият файл.
Това не е до го прави едно допълнително четиво, че той контрира края на файла.
По този начин, правилното условие би било следното:
fgets и три аргумента - изход, размер на продукцията, както и РП -
и всички, че не е равна на нула.
Това е подходът, взехме printer.c,
и в този случай, след приключването на цикъла изходи,
може да се нарече feof или ferror да информира потребителя на мотивите за излизане от този цикъл.
>> Писане и четене от файл, в основата си,
прост процес на 3 части.
Първо, трябва да отворите файла.
Второ, ние поставяме някои неща в нашия файл или да вземат някои неща от него.
Трето, затворете файла.
Първата и последната части са лесни.
Средната част е мястото, където сложната неща.
И макар, че под предния капак сме винаги справяне с дълга поредица от нули и единици,
тя не помогне при кодирането да добавите слой на абстракция
, която превръща последователност в нещо, което по-скоро наподобява това, което сме свикнали да виждаме.
Например, ако ние работим с 24-битов растерна графика файл,
ние вероятно ще бъде четене или писане на три байта.
В такъв случай би имало смисъл да се определи и по подходящ начин назове
структура, която е на 3 байта голям.
>> Въпреки че работата с файлове може да изглежда сложно,
използването им, ни позволява да направим нещо наистина забележително.
Ние можем да променим състоянието на света извън нашата програма,
ние можем да създадем нещо, което живее извън живота на нашата програма,
или дори можем да променим нещо, че е създаден преди нашата програма потекли.
Взаимодействаме с файлове е наистина мощен част от програмирането на C.
и аз съм развълнуван да видя какво ще да се създаде с него в кода, за да дойде.
Моето име е Джейсън Hirschhorn. Това е CS50.
[CS50.TV]
>> [Смях]
Добре. Един дъх. Ето ни.
Когато мислим за даден файл - >> О, чакай. Извинете.
[Смях] Добре.
Ей там.
Когато мислим за даден файл -
Когато мислите за файл - Добре. Кажи ми, когато сте готови.
О, чудесно.
Въпреки, че четенето от teleprompter може да изглежда - не. Моя грешка.