Поред најједноставнијих апликација, већина програма мора читати или писати датотеке. То може бити само за читање конфигурационе датотеке или анализатора текста или нечег софистициранијег. Овај туториал се фокусира на употребу датотека са случајним приступом у Ц.
Програмирање И / О датотеке случајног приступа на Ц
Основне операције датотека су:
- фопен - отворите датотеку - одредите како се отвара (читај / упиши) и унесите (бинарни / текст)
- фцлосе - затворите отворену датотеку
- фреад - читање из датотеке
- фврите - напишите у датотеку
- фсеек / фсетпос - померите показивач датотеке на неко место у датотеци
- фтелл / фгетпос - говори вам где се налази показивач датотеке
Две основне врсте датотека су текст и бинарни. Од ове две, бинарне датотеке су обично једноставније за решавање. Из тог разлога и чињенице да случајни приступ текстуалној датотеци није нешто што треба често да радите, овај водич је ограничен на бинарне датотеке. Прве четири горе наведене операције односе се и на текстуалне и на случајне датотеке. Последња два само за случајни приступ.
Случајни приступ значи да се можете преместити у било који део датотеке и читати или писати податке из ње без потребе да прочитате читаву датотеку. Пре много година, подаци су били смештани на велике колуте рачунарске траке. Једини начин да се дође до тачке на траци био је читањем читавог трака. Затим су се појавили дискови и сада можете директно да прочитате било који део датотеке.
Програмирање са бинарним датотекама
Бинарна датотека је датотека било које дужине која садржи бајте са вредностима у опсегу од 0 до 255. Ови бајти немају друго значење за разлику од текстуалне датотеке где вредност 13 значи повратак носача, 10 значи довод линије и 26 значи крај датотеке. Софтвер који чита текстуалне датотеке мора да се бави овим другим значењима.
Бинарне датотеке шаљу бајт, а савремени језици теже раде са стреамовима, а не с датотекама. Важан део је проток података, а не одакле долази. Ин Ц, о подацима можете размишљати или као датотеке или стреамови. Са насумичним приступом, можете читати или писати у било који део датотеке или тока. С секвенцијалним приступом, морате покренути датотеку или струјати од почетка попут велике врпце.
Овај узорак кода приказује једноставну бинарну датотеку која се отвара за писање, а у њу се уписује текстуални низ (цхар *). Обично то видите помоћу текстуалне датотеке, али можете текст написати у бинарну датотеку.
Овај пример отвара бинарну датотеку за писање, а затим у њу уписује знак цхар * (стринг). Промјена ФИЛЕ * враћа се из позива фопен (). Ако ово не успе (датотека може постојати и бити отворена или само за читање или може бити грешка у називу датотеке), враћа 0.
Наредба фопен () покушава отворити наведену датотеку. У овом случају је тест.ткт у истој фасцикли као и апликација. Ако датотека садржи путању, тада се сва коса коса црта морају удвостручити. "ц: \ фолдер \ тест.ткт" није тачан; морате да користите "ц: \\ фолдер \\ тест.ткт".
Пошто је режим датотеке „вб“, овај се код уписује у бинарну датотеку. Датотека се креира ако не постоји, а ако постоји, брише се све што је било. Ако позив за фопенисање не успе, можда зато што је датотека отворена или име садржи неважеће знакове или неважећу стазу, фопен враћа вредност 0.
Иако можете само проверити да ли фт није нула (успех), овај пример има функцију ФилеСуццесс () да то експлицитно уради. У оперативном систему Виндовс емитује успех / неуспех позива и имена датотеке. Мало је напорно ако наставите са перформансама, тако да то можете ограничити на отклањање грешака. У оперативном систему Виндовс мало је прекомерног исписа текста системском исправљачу грешака.
Фврите () позиви емитују наведени текст. Други и трећи параметар су величина знакова и дужина низа. Обоје су дефинисани као сизе_т који је непише цијели број. Резултат овог позива је писање бројева ставки одређене величине. Имајте на уму да уз бинарне датотеке, иако пишете низ (цхар *), не додају никакав повратни знак или знак уноса линије. Ако их желите, морате их експлицитно укључити у низ.
Начини датотека за читање и писање датотека
Када отворите датотеку, одредите како је треба отворити - да ли да је креирате из нове или је пребрисујете и да ли је текст или бинарни облик, читајте или пишите и ако желите да је додате. Ово се врши помоћу једног или више специфичара за режим датотека који су једнострука слова „р“, „б“, „в“, „а“ и „+“ у комбинацији са осталим словима.
- р - Отвара датотеку за читање. Ово не успева ако датотека не постоји или је не можете пронаћи.
- в - Отвара датотеку као празну датотеку за писање. Ако датотека постоји, њен садржај се уништава.
- а - Отвара датотеку за писање на крају датотеке (додаје се) без уклањања ЕОФ маркера пре него што упише нове податке у датотеку; ово прво ствара датотеку ако не постоји.
Додавањем „+“ у режим датотеке ствара се три нова начина:
- р + - Отвара датотеку и за читање и за писање. (Датотека мора постојати.)
- в + - Отвара датотеку као празну датотеку и за читање и за писање. Ако датотека постоји, њен садржај се уништава.
- а + - Отвара датотеку за читање и додавање; операција додавања укључује уклањање ЕОФ маркера пре него што се у датотеку упишу нови подаци, а ЕОФ маркер се обнавља по завршетку писања. Прво ствара датотеку ако не постоји. Отвара датотеку за читање и додавање; операција додавања укључује уклањање ЕОФ маркера пре него што се у датотеку упишу нови подаци, а ЕОФ маркер се обнавља по завршетку писања. Прво ствара датотеку ако не постоји.
Комбинације режима датотека
Ова табела приказује комбинације режима датотека и за текстуалне и за бинарне датотеке. Генерално или читате или пишете у текстуалну датотеку, али не и једно и друго истовремено. Помоћу бинарне датотеке можете истовремено и читати и писати у исту датотеку. Табела испод приказује шта можете учинити са сваком комбинацијом.
- р текст - прочитати
- рб + бинарно - читати
- р + текст - читати, писати
- р + б бинари - читати, писати
- рб + бинари - читати, писати
- в текст - писати, креирати, скраћивати
- вб бинари - писање, креирање, скраћивање
- в + текст - читање, писање, креирање, скраћивање
- в + б бинарно - читати, писати, креирати, скраћивати
- вб + бинари - читати, писати, креирати, скраћивати
- текст - написати, створити
- аб бинари - писати, креирати
- а + текст - читање, писање, креирање
- б + бинарно - писати, креирати
- аб + бинарно - пише, креирај
Ако само не креирате датотеку (користите "вб") или само читате (користите "рб"), можете се склонити употребом "в + б".
Неке имплементације омогућавају и друга слова. Мицрософт, на пример, омогућава:
- т - текстуални режим
- ц - починити
- н - необвезујући
- С - оптимизација кеширања за секвенцијални приступ
- Р - кеширање несеквенцијалног (случајни приступ)
- Т - привремено
- Д - брисање / привремено, које убија датотеку када је затворена.
Они нису преносиви, па их користите на властити ризик.
Пример складиштења датотека са случајним приступом
Главни разлог коришћења бинарних датотека је флексибилност која омогућава читање или писање било где у датотеци. Текстуалне датотеке омогућавају само читање или писање узастопно. Са распрострањеношћу јефтиних или бесплатних база података као што су СКЛите и МиСКЛ, смањује потребу за коришћењем случајног приступа бинарним датотекама. Међутим, случајни приступ записима датотека помало је старомодан, али ипак користан.
Испитивање примера
Претпоставимо да пример приказује индексни пар података и пар података који похрањују низове у датотеку са случајним приступом. Жице су различите дужине и индексиране су позицијом 0, 1 и тако даље.
Постоје две неважеће функције: ЦреатеФилес () и СховРецорд (инт рецнум). ЦреатеФилес користи цхар * међуспремник величине 1100 за држање привременог низа састављеног од низа формата мсг праћеног са н звездицама где н варира од 5 до 1004. Два ФИЛЕ * су креирана оба користећи вб филемоде у променљивим фтиндек и фтдата. Након креирања, они се користе за манипулирање датотекама. Две датотеке су
- индек.дат
- дата.дат
Индексна датотека садржи 1000 записа типа индектипе; ово је структ индекстип који има два члана поз (типа фпос_т) и величину. Први део петље:
попуњава стринг мсг као што је овај.
и тако даље. Онда ово:
пушта структуру дужином низа и тачком у датотеци података у коју ће се записати низ.
У овом тренутку се и индексна датотека и низ података могу записати у њихове датотеке. Иако су то бинарне датотеке, оне се записују узастопно. Теоретски, можете да пишете записе на позицији која се налази изван тренутног краја датотеке, али то није добра техника за употребу и вероватно уопште није преносива.
Завршни део је затварање обе датотеке. Ово осигурава да се последњи део датотеке упише на диск. Током писања датотека, мноштво записа не иде директно на диск, већ се чува у тампонима фиксне величине. Након што слово попуњава међуспремник, целокупни садржај међуспремника се уписује на диск.
Функција испирања датотека форсира испирање и можете одредити стратегије испирања датотека, али оне су намењене текстуалним датотекама.
Функција СховРецорд
Да бисте тестирали да се сваки одређени запис из датотеке података може дохватити, морате знати двије ствари: одакле почиње у датотеци података и колико је велика.
Ово ради индексна датотека. Функција СховРецорд отвара обе датотеке, тражи одговарајућу тачку (рецнум * сизеоф (индектипе) и узима број бајтова = сизеоф (индекс).
СЕЕК_СЕТ је константа која одређује одакле се ради фсеек. За то су дефинисане још две константе.
- СЕЕК_ЦУР - тражите у односу на тренутни положај
- СЕЕК_ЕНД - потражите апсолут од краја датотеке
- СЕЕК_СЕТ - потражите апсолут од почетка датотеке
Можете да користите СЕЕК_ЦУР за померање показивача датотеке према величини (индексу).
Добивши величину и положај података, остаје нам само да их пронађемо.
Овде користите фсетпос () због типа индек.пос који је фпос_т. Алтернативни начин је употреба фтелл уместо фгетпос и фсек уместо фгетпос. Пар фсеек и фтелл раде са инт док фгетпос и фсетпос користе фпос_т.
Након читања записа у меморију, додаје се нулти знак \ 0 да би се претворио у правилно ц-стринг. Не заборавите или ћете се сударити. Као и раније, фцлосе се позива на обе датотеке. Иако нећете изгубити никакве податке ако заборавите фцлосе (за разлику од писања), имаћете цурење меморије.