Лекті ашу және жабу


Лекпен жұмыс жасауды бастамас бұрын, оны инициялизациялау керек, яғни ашу керек. Сонда лек орындалатын программада FILE типті алдын ала анықталған құрылыммен байланысады. FILE құрылымдық типінің сипатталуы stdio.h тақырыптық файлында орналасқан. FILE құрылымында лекпен жұмыс жасуға арналған компонентер орналасқан, дербес жағдайда, буферге нұсқаушы, лектегі ағымдағы позициядағы нұсқаушы(индикатор) және басқа ақпарат.

Лекті ашқанда программада FILE құрылымдық типті обьектіне нұсқаушысы болып табылатын, лекке нұсқаушы қайтып оралады.Бұл нұсқаушы лекті қалған басқа операцияларда идентификациялайды.

Лекке нұсқаушы , меысалы, fp, программада келесі түрде жариялануы керек:

#include

FILE *fp;

Лекке нұсқаушы лекті ашу функциясының орындалуы нәтижесінде:

fp = fopen (файл _аты,ашылу- режим);

файл _аты және ашылу- режим параметрлері лекпен байланысты және режимдер жолымен байланысты файл атынан тұратын символдар массивіне нұсқаушы болып табылды. Бірақ, бұл параметрлер фацлды ашу функциясын шақыранда жол түрінде және берілуі мүмкін:

fp = fopen("t.txt", "r") ;

мұндағы t. txt – лекпен байланысты қандай да бір файл аты;

r файлмен жұмыс режимдерінің бір белгіленуі (лекке рұқсат алу типі).

Лекпен байланысты, стандартты файлды келесі алты режимнің біреуімен ашуға болады:

"w"жаңа мәтіндік файлы жазу үшін ашылады. Егер файл бар болған болса, онда алдынғы мазмұны тазаланып, жаңадан қайта құрылады;

"r" – бар мәтіндік файл оқу үшін ғана ашылады;

"а" – мәтіндік файл оған жаңа ақпарат қосу үшін (файл соңына) ашылады (немесе егер файл жоқ болса, құрылады) . V режиміне қарағанда "а" режимі бар файлдарды олардың алдындағы версияларын жоймай ашады және оған ары қарай жазуға болады;

"w+" – жаңа мәтіндік файл жазу үшін және ары қарай бірнеше рет қолдану үшін ашылады.Егер файл бар болса, онда оның мазмұны тазарады. Файлдардың келесі ашылуы жазу мен одан оқу файлдың кез келген жерінде рұқсат етілген, сонымен қатар файлдың соңына да жазу қосуға болады, яғни, файл көлемі үлкейе алады (көбейе);

"r+" – бар мәтіндік файл оқу үшін де жіне файлдың кез келген жеріне жазу үшін де ашылады. Бірақ, бұл режимде файлдың соңына жазу мүмкін емес, яғни, файл өлшемін кеңейту мүмкін емес.;

"а+" – мәтіндік файл өзгертуге болатындай ашылады немесе құрылады (егер ол жоқ болса) яғни, кенз келген жерден оқу мен жазу мүмкін болатындай; Сонымен қатар "w+" режиміне қарағанда бар файлды оның мазмұнын жоймай ашу мүмкін; "г+" режиміне қарағанда "а+" режимінде файл соңына жазу енгізуге болады, яғни, оның көлемін өзгертуге болады.

Лекті мәтіндік немесе екілік(бинарлық) режимде ашуға болады.

Мәтіндік режимде лектен оқылған символдар комбинациясы CR (13 мәні ) және LF (10 мәні) , яғни, " каретканы қайтару" және "жолды тасымалдау" басқарушы кодтары жаңа жолдың бір символына '\n' (LF) , CR және LF кезектілігін ауыстыру арқылы түрленеді.

Егер лекпен байланысты файл мәтіндік емес, өзіндік екілік ақпараттан тұрса, онда көрсетілген түрлендірулер керек емес және зиянды болуы да мүмкін. Бұндай түрлендірусіз алмасу b әрпімен белгіленетін, екілік немесе бинарлық режимде орындалады. Мысалы, "r+b" немесе "wb". Кейбір компиляторларда мәтіндік файл t әрпімен белгіленеді, яғни, "a+t" немесе "rt" түрінде жазылады.

Егер лек өзгерту үшін шылған болса, яғни, режим параметрінде "+", символы бар болса, онда лекке шығарумен қатар одан оқу да мүмкін. Бірақ, режимді ауыстыру (оқудан жазуға өту немесе керісінше) лек нұсқаушысын керекті позицияға орналасырғаннан кейін ғана орындалуы керек.

Лекті ашуда келесідей қателер пайда болуы мүмкін: лекпен байланысқан нұсқалған файл табылған жоқ (оқу режимі үшін); диск бос емес немесе дискіге жазуға рұқсат жоқ және т.б. fopen() функциясының орындалуы кезінде динамикалық жадының бөлінуі орындалатынын ескерте кету керек. Ол жоқ болған жағдайда "Not enough memory" (жадыда орын жоқ) қате белгісі шығады. Аталған жағдайларда, лекке нұсқаушы NULL мәніне ие болады.

Лекпен байланысқан файлдарды ашуда қолданылатын операторлар кезектілігіне мысал келтірейік:

if ((fp=fopen("t.txt", "w"))==NULL)

{

perror("файлды ашуда кеткен өателік t.txt \n");

exit(0);

}

Мұндағы NULL - stdio.h файлында анықталған нөлдік нұсқаушы.

Лекті ашқандағы қате туралы хабарламаны экан дисплейіне шығару үшін реггог() библеотеекалық функциясы қолданылады, оның stdio.h –тағы пототипінің түрі келесідей:

void perror (const char * s);

perror() функциясы s нұсқаушысымен адрестелген символдар жолын шығарады, одан кейін: қос нүкте, пробел және қате туралы хабарлама орналасады. Қатенің мазмұны мен форматы программалау жүйесінің жүзеге асуымн анықталады. Қате туралы хабарламаның мәтіні қате нөміріне байланысты реггог() фуекциясымен таңдалады. Қате нөмірі Си тілінің библеотекасының жанындағы, сонымен қатар енгізу – шығару функциялары жанындағы int errno(int errno тақырыптық файлында анықталған ) айнымалысына енгізіледі. Файл ашылғаннан кейін, оған ақпарат жазу арқылы намесе оқу арқылы (режимге байланысты) онымен жұмыс істеуге болады.

Фaйлдармен жұмыс істеп болған соң дискіде ашылған файлдарды міндетті түрде жабу керек. Ол үшін мына библеотекалық функция қолданылады

int fclose (лекке_нұсқаушы);

Ашылған файлды оны fclose( ) функциясы көмегімен жапқаннан кейін ғана қайта ашуға болады (мысалы онымен жұмыс істеу режимін өзгертіу үшін).