«С++ тілінде программалау» пәні бойынша

 

      Кіріспе 

      ЭЕМ-нің сыртқы құрылғысындағы ақпаратпен байланыста болатын негізгі ұғым файл ұғымы саналады.

     Көптеген  адамдар компьютер дискілерінде  файл түрінде сақталынған ақпаратпен жұмыс істейді.Файлдарда әр түрлі, керек бағдарламалар бар. Сондықтан  бағдарламамен жұмыс істеген қолданушыға файлдармен дұрыс жұмыс істеуі керек.

    С++ тілінде ішкі файлдың аналогы болып ағын саналады. С++ де ағынға тип сәйкестендірілмейді. Ағын- енгізу,шығару процесінде берілетін байттық тізбек. Ағын қандай да бір сыртқы құрылғымен немесе дискідегі файлмен байланысты болу керек. С++ терминологиясында ол былайша айтылады: ағын қандайда бір құрылғыға немесе файлға бағытталуы қажет.

    Курстық жұмыстың тақырыбы өте ауқымды болып  келеді. Курстық жұмысты жазу барысында  келесідей негізгі файлдарды ашу және жабу, файлдармен жұмысты ұйымдастыру, файлда форматты енгізу, шығару, символдарды енгізу, файлдың атын өзгерту тақырыптары қозғалмақшы.

    Курстық жұмыстың мақсаты: С++ тілінде файлдармен жұмыс жасау мүмкіндіктерін зерттеу.

    Курстық жұмыстың міндеттері:

  • Физикалық файлдың негізгі түсініктерін зерттеу;
  • С++ тіліндегі файлдармен жұмыс жасауға арналған функциялармен пороцедураларды зерттеу;
  • С++ тіліндегі файлдармен жұмыс жасау ерекшеліктерін меңгеру;
  • Файлдары құру арқылы оның практикалық жүзеге асырылуын орындау.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

        1. Файлдармен жұмысты ұйымдастыру

    1.1.  Дискідегі файлмен жұмыс

    Әр  файлдың дискіде аты бар. Ол ат оған кіру үшін арналған. Бағдарламаларда  файлдардың аттарын жолдар түрінде  көрсетілген. Файлдардың аттарында  бағытталған талаптар әр түрлі операциялы жүйелерде айырмашылығы болады. DOC және Windows жүйлерінде файл аты ұзындығы бірден сегіз таңбаларға жететіндей көрінеді. Олардан кейін міндетті емес нүктелер болады. Microsoft Windows жүйесінде файл аты 256 таңбаларға жететін ұзындықтан тұрады.

    Мысалы, Windows 95/98 жүйелерінде келесі белгілерді қолдануға болмайды:              : * ?  ” <> | 

    Операция  жүйелеріндегі файл аттарына қойылатын  талаптарды ескеру қажет.

    Файлдың ашылуы дегеніміз – енгізу және шығару ағымдары. Ол дискідегі нақты файлмен ассоцияланады. Файлмен жұмыс істеп болсақ, оны жабу міндетті. Файлды ашу үшін Fopen ( )  функциясы қолданылады ( ). Fopen ( )  прототипі stdio.h  файлында бар. Әр ашылатын файлға FILE жүйесіне бағытталған көрсеткіші қолдану керек. Бұл көрсеткіш кейінгі операцияларда қолданылады. Егерде fopen ( )  функциясы файлды аша алмаса, ол Null атты нолдік көрсеткішті оралтады.

    Filename дәлелі деген – ол файлдың  аты бар жол.  filename  жолы файлға  апаратын жолды көрсетеді. Mode дәлелі  файлдың ашу уақытын көрсетеді.

Кесте 1-де  fopen ( ) функциясының  mode дәлелінің мағыналары көрсетілге 

1-Кесте

Fopen ( ) функциясының  mode дәлелінің мағыналары

Параметр Режимі
r Оқу оқу үшін ашу
w Жазу үшін жасау
а Қосу үшін ашу
r + Жазу және оқу  үшін арналған файлдарды ашу.
w + Оқу және жазу үшін жасау
a + Файлдарды жаңарту  үшін ашады және жасайды; жазу файлдың  соңында шығарылады
rb Екілік тәртіптегі файлды оқу үшін ашу.
wb Екілік тәртіптегі файлды жазу үшін жасау. Егер ондай  файл болса, оның ішіндегі жоғалады.
ab Екілік тәртіптегі файл соңына жазу үшін файлды ашады  және жасайды.
rb+ Екілік тәртіптегі файлды жаңарту үшін ашады.
wb+ Екілік тәртіптегі файлды жаңарту үшін жасайды.
ab+ Екілік тәртіптегі файлды жаңарту үшін ашады және жасайды.
 
 
 

           1.2. Файлмен форматтық алмастыру

     Форматтық шығару функциясының көмегімен символдық  түрде берілген есептеу нәтижесінен  бірге мәтіндік файл жасауға болады. Жасалған файлды экранда қарауға, принтрге басуға, мәтіндік ребактор көмегімен  редакциялауға болады.

     Форматтық шығару функциясының жалпы түрі:

      Int fprintf (ағынды көрсеткіш, форматтық  жол, айнымалар тізімі);

      Бұрын қолданған экранға шығаруды ұйымдастырудың printf ( )  функциясы fprintf ( ) функциясының жеке нұсқасы болып табылады.Программада printf ( )  - тың орнына fprintf ( ) қолдануға болады.

     Мәтіндік  файлды форматтап енгізу үшін fscanf ( ) фнкциясы көмегімен жүзеге асырылады. Fscanf ( ) функциясының прототипі:

int fscan ( FILE fp, const char fmt,…);

fp –  дәлелі жүйесі FILE  типінің көрсеткіші. Формат жолы scanf ( ) функциясындағы жолмен ұқсас. Көп нүкте тағы да қосымша мәліметтердің бар екенін білдіреді.  Fscanf ( ) файлмен жұмыс істеу үшін яғни бірнеше сандар немесе жолдар бар мәтінде файл қажет етеді.

      Бұл функцияны берілген мәліметтер мәтіндік файлда алдын –ала дайындалған жағдайда қолданған ыңғайлы.

  Мысалы, файлдағы мәтін мынандай жағдайды  көрсетеді:

    1. 87.001

     100.02       

          0.00456       1.0005

fscanf.cfscanf ( ) функциясы барысында форматталған файлды оқу программасы.

/ * берілген fscanf ( ) форматын қолдануы арқылы оқу.* /

 #include <stdlib.h >

 #include <stdio.h>

 int main (void)

 {

 float fl, f2, f3, f4, f—;

 FILE *fp;

 if ( (fp = fopen (''INPUT.TXT'', ''r'') ) == NULL)

{

fprintf (stderr, ''Error opening file. \n'');

exit (1);

 }

fscanf (fp, %f %f %f %f %f, δf1, δf2, δf3, δf4, δf5);

printf ( " The values are %f ,%f, %f, %f, and %f \n. ", f1, f2, f3, f4, f5);

fclose (fp);

return 0;

}

Нәтиже 
         The values are 123.449997, 87.000999, 100.019997, 0.004560, and 1.000500         
 

    1.3.  FILE құрылымының көмегімен файлдармен жұмыс жасау

    Файлдармен  жұмыс істеу мәнін түсіну үшін, енгізу-шығару ағымдары арқылы қол  жеткізуді қарастыру керек. Функциялардың  орындалуын қамтамасыз ету үшін, studio.h тақырыпшалық файлын іске қосу қажет. Файлдармен жұмыс істеудің жалпы сызбасы төмендегідей:

    1. Файлды қажетті режимде ашу  (оқу, жазу, толықтыру, оқу мен  жазу).

    2. Файлдағы деректерді оқу немесе  оларды файлға жазу.

    3. Файлға қол жеткізуді жабу.

    Енгізу-шығару ағымдары арқылы ашылған әр файл үшін studio.h тақырыпшасында анықталған FILE үлгісі бойынша төмендегідей ішкі құрылымдық айнымалы құрылады:

    tipedef struct

    {

    int level;                                //жағдай жалаушасы –буфер бос  (толық) 

    unsigned flags;                      //файл жағдайларының жалаушалары;

    char fd;                                 //файл дескрипторы

    unsigned char hold;               //қосалқы символ

    int bsize;                                //ішкі буфер көлемі

    unsigned char_FAR*buffer;  //буфер ішіндегі қол  жеткізу сілтегіші

    unsigned char_FAR*curp;   //қол жеткізу сілтегішінің  ағымдық мәні

    unsigned istemp;                   //уақыт файл жалаушасы

    short token;                            //файл шынайылығының маркері

    } FILE;

    Файлдың аты тек қол жеткізуді ашқанда  ғана қолданылады. Одан әрі қарай файл айнымалысымен жұмыс жүреді, ол файл ашылғанда орнатылады.

    Файлдармен  жұмыс істегенде қолданылатын бірінші  функция –fopen ( ). Ол екі параметрдің  болуын талап етеді: файлға жол мен  оны ашу режимін. Егер файл бағдарлама орналасқан бумада болса, оның атын көрсетсе болғаны. Файлды ашу операциясы сәтсіз аяқталуы мүмкіндігіне байланысты, оны орындаған кезде fopen ( ) функциясы қайтаратын мән талданады. fopen ( ) функциясы сәтті аяқталған кезде сілтегіші FILE типті құрылымға қайта оралып, егер файлды ашу кезінде қате кеткен болса, функция NULL-ді қайтарады.

    Кез-келген файлды ашу сызбасы төмендегідей болуы мүмкін:

    FILE*myfile;

    myfile= fopen (“hello, txt”, “rt”);

    of (myfile= NULL)

      //файлды сәтті ашу кезіндегі іс-әрекеттер тізімі

    eise

      // файлды сәтсіз ашуға берілген жауап

    Ашылатын  файлдарға қол жеткізу режимдерін орнатуға болады. Режимді орнату кезіндегі  бірінші символ төмендегідей болуы  мүмкін:

    *r – файл тек оқу үшін ашылады.  Егер файл жоқ болса, функция  NULL мәнін қайтарады. Сәтті ашылған кезде сілтегіш файлдың басына орнатылады.

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

    *a – файл файл соңына қосу үшін ашылады. Сілтегіш файлдың соңына қойылады.

     *r+, w+, a+  - файл  жаңарту үшін  ашылады. Бұл режимдерде оқу  мен жазуға болады. Қол жеткізуді  ашу кезіндегі сілтегіштің орны  плюс белгісі жоқ режимдегідей.

    * - файл мәтін режимінде ашылады.  Бұл жағдайда жол соңыныі символы өңделіп, ол ақпаратты оқу кезінде онша маңызды емес болғасын, жаңа жолға көшкенде орнатылады. Мәтіндік режимде саны сақталған кезде мәтіндік көрінісі үшін қанша символ қажет болса, сонша байт керек болады, яғни long типті 1 234 567 сандары файлда 4 байт емес, 7 байтты қажет етеді.

    *b – файл қосарлы режимде ашылады.  Қосарлы режимде символдар ешқалай  өзгермейді.

    Егер  ашылатын файлдың типі көрсетілмесе, онда жариясыз түрде файл мәтіндік деп саналады.

    Файлдармен  жұмыс жасауға арналған келесі функциялар бар:

  • FILE * fopen (сonst char* filename, char *type); - filename атауы бар файлды ашып, келесі операцияларда ағымды ұқсастыруға арналған сілтегішті қайтарады;
  • int fclose (FILE*stream); - stream ағымын жабады. Fclose функциясы сәтті аяқталғанда 0-ді, ал егер қате кеткен болса, FОF қайтарады;
  • FILE*freopen (сonst char* filename, char *type, FILE*stream); - stream көрсеткен ағымды жабады, сосын filename атауы бар файлды ашады, дәл сол файлды қайта ашуға тырысқан кезде қол жеткізу құқын өзгертіп, ішкі буферлерді тазартып, жазу немесе оқу сілтегіштерін файлдың басына немесе аяғына қояды;
  • int feof (FILE*stream); -ағымдағы файлдың соңына жетуге тырысу. Fеоf функциясы ағымдағы соңғы енгізу операциясын орындау кезінде файл соңының индикаторы анықталса, нөл емес мәнді, ал файл соңы анықталмаса, 0-ді қайтарады.

    Файлдағы  деректерді оқу мен жазу функцияларының барлығын келесі топтарға бөлуге болады:

  • символдармен енгізу-шығару функциясы;
  • жолдармен енгізу-шығару функциясы;
  • топтап енгізу-шығару функциясы;
  • форматтап енгізу-шығару функциясы.

    Символдармен  енгізу-шығару функциясы операцияларында  файлдан 1 символ қабылданып немесе файлға 1 символ жіберіледі.

  • int fgetc (FILE*fp) –ашылған файлдан символдарды оқу;
  • int fputc (int  ch, FILE*fp) –файлға ch символын жазу.

    Мысалы, (source) бастапқы файлды (destination) көшірілетін файлға  символдап көшіру: 

    char ch;

    FILE* source= fopen (“one”, “rb”);

    FILE* destination= fopen (“two”, “wb”);

    while (!feof (source))

    {

    ch= fgetc (source);

    fputc (ch, destination);

    }

    Жолдармен енгізу-шығару операцияларында бір ретте файлдардан (немесе файлдарға) символдар жолдары көшіріледі.

  • int fgetc (char*S, int m, FILE*fp) – fp файлдан байттарды алып, оларды S жолына ''\n'' символы кездескенше, немесе m байт болғанша жаза береді;
  • int fputc (char *S, FILE*fp) –файлға S жолдан тұратын байттарды ''\n'' символына алмастырылмайтын және файлға көшірілмейтін 0-терминатор кездескенше жаза береді.

      Мысалы:

    char string [256];

    FILE* source= fopen (“1.txt”, “r”);

    FILE* destination= fopen (“2.txt”, “w”);

    fgets (string, 256, source);

    fputs (string, destination);

    {

    ch= fgetc (source);            //оқу

    fputc (ch, destination);     //жазу

    Топтап  енгізу-шығару функциясы операцияларында  ақпарат блоктармен енгізіледі. Бұл  функцияның ерекшелігі –енгізу-шығару жүзеге асырылатын жады аумағындағы деректердің сипаты қандай болса да бәрібір.

  • int fread (void*ptv, int size, int n, FILE*fp) – ptv cілтегіші көрсеткен жады аумағына fp файлынан size байттардан тұратын n блоктарды көшіреді;
  • int fwrite (void*ptv, int size, int n, FILE*fp) – fp ашылған файлына ptv сілтегіші көрсеткен жады аумағынан size байттардан тұратын n блоктарды көшіреді.

    BOOKS құрылымдық айнымалысын оқу мен  жазу мысалын қарастырайық:

    struct

    {

    char name [32];

    char title [64];

    int year;

    float price;

    } BOOKS;

    FILE* source= fopen (“1.txt”, “r”);

    FILE* destination= fopen (“2.txt”, “w”);

    fread (&BOOKS, sizeof (BOOKS), 1, source);          //оқу

    fread (&BOOKS, sizeof (BOOKS), 1, destination);   //жазу

    Форматталған  енгізу-шығарудың функциясының ерекшелігі –енгізген кезде жол байттарының түрленуі орындалып, арнайыландырылған айнымалылардың алынған мәндері беріледі. Шығарған кезде мәндердің қайта түрленуі жүзеге асырылып, олардың символдық бейнелері шығару ағымына орналастырылады.

  • int fprint (FILE*stream, const char*format [,аргумент... ] –форматталған шығаруды ағымға бағыттайды. Функция аргументтерді stream ағымына шығарады. Әр аргумент үшін шығару форматы format сілтегіші анықтаған жолда беріледі. Жолда берілетін форматтардың саны аргументтер санымен бірдей болуы тиіс.
  • int fscanf (FILE*stream, const char*format, [, adr,…]) –ағымнан форматталған енгізуді жүзеге асырады.

      Форматталған  енгізу-шығарудың мысалын қарастырайық:

    char fam [15];

    char name [15];

    FILE* source= fopen (“1.txt”, “r”);

    FILE* destination= fopen (“2.txt”, “w”);

    fscanf (source, “%s%s”, &fam, &name);           //оқу

    fprint (destination, “%s%s\n”,fam, name);         //жазу

    Файлдағы  сілтегіштің орнын мына функциялардың  көмегімен ауыстыруға болады:

  • int fseek (FILE*stream, long pos, int mode); -cілтегішті көрсетілген бағытта көрсетілген байттар санына ығыстырады. mode параметрі файлдағы ағымдық орынның неге қатысты саналатынын анықтайды, оның келесі символдық және сандық мәндері бар (studio.h-да орнатылған);
  • SEEK_SET немесе 0–файл басына қатысты ығысуы;
  • SEEK_CUR немесе 1 –ағымдық орынға қатысты ығысуы. Егер оң мәнді сан көрсетілген болса, алға ығысады, теріс сан болса, артқа ығысады.
  • SEEK_END немесе 2 –файл аяғына қатысты ығысуы.

    fseek сілтегіш табысты түрде орын  ауыстырса, 0-ді қайтарады, қате  кеткен болса –нөлдік емес мәнді қайтарады.

Мысалдар.  fseek (myfile, 3, SEEK_SET);        //файл басынан 3 орынға жылжу

fseek (myfile, -3, SEEK_CUR); //файл басынан жанға 3 байтқа жылжу

                                                    //ағымдық орыннан

fseek (myfile, 3,1);                // файл соңының жанына 3 орынға жылжу

  • fseek (myfile, -3, SEEK_END); //файл соңынан 3 орынға жылжу

    void rewind (FILE*stream); -файлдың басына ағымдық  байттың сілтегіші қойылады. rewind шақырылғаннан кейін файлмен  жасалатын келесі операция енгізу немесе шығару болуы мүмкін. int fsetpos (FILE*stream, const fops_t*pos); - stream файл сілтегішін жаңа орынға қояды. fsetpos сәтті аяқталғанда 0-ді қайтарады. Қате кеткен болса –нөлдік емес мәнді қайтарады. 

    2. С++ тіліндегі файлдармен жұмыс

    1. Файлдармен жұмыс жасауға арналған функциялар

    Бұл функциялар SysUtils модулінде орналасады.

    Файлдарды ашу мен жабу үшін келесі функциялар қолданылады:

  • int FileOpen (const AnsiString FileName, unsigned Mode); -файлға қол жеткізуді ашып, ашық файлдың дескрипторын қайтарады. Егер операция сәтті аяқталса, функция 1-ді қайтарады. Екінші параметр файлға қол жеткізу режимін көрсетеді. Ең жиі қолданылатын константалар:
  • fmCreate –егер файл бар болса, жазуға жол ашып береді, әйтпесе жаңасын құрады;
  • fmOpenRead –файлды оқу үшін ашады;
  • fmOpenWrite –файлды жазу үшін ашады;
  • fmOpenReadWrite –файлды оқу және жазу үшін ашады;
  • int FileCreate (const AnsiString FileName); -атауы берілген жаңа файлды құрып, ашылған файлдың дескрипторын қайтарады. Егер операция сәтті аяқталса, функция 1-ді қайтарады;
  • void FileClose (int Handle); -дескрипторы көрсетілген файлға қол жеткізуді жабады.

    Файлға  деректерді енгізу-шығару келесі функциялардың  көмегімен жүзеге асырылады:

  • int FileRead (int Handle, void*Buffer, unsigned Count) –файлдағы көрсетілген байттар санын мекен-жайы екінші параметрде көрсетілген буферге оқуды жүзеге асырады. Үшінші параметр буфердің байттармен берілген көлемін көрсетеді. Функция оқылған байттардың нақты санын қайтарады.
  • int FileWrite (int Handle, const void*Buffer, unsigned Count) –екінші параметрде мекен-жайы көрсетілген буфердің ішіндегісін жазып алады, үшінші параметр жазуға арналған байттар санын көрсетеді. Функция оқылған байттардың нақты санын қайтарады, егер қате кеткен болса, 1- қайтарылады.

    Сілтегіштің орнын ауыстыру үшін келесі функциялар қолданылады:

  • int FileSeek (int Handle, int Offset, int Origin) –ағыдық орынның сілтегіші орын ауыстырады. Функция сәтті шақырылған болса, жаңа орынды немесе -1-ді қайтарады, ығыстырылатын байттар саны үшінші параметрде беріледі. Екінші параметрдің мәндері:
  • 0 –файл басынан бастап орын ауыстырылады;
  • 1 –ағымдық орыннан бастап ауыстырылады;
  • 2 –орын ауыстыру файл соңынан басталады.

    Мысал. 1.txt атаулы файлды құрып, оны файлдар  жобасы тізіміне қосады. Әрі қарай  файлдағы деректерді буферге оқып, оқылған деректерді 2.txt файлына жазу керек.

    void_ _fastcall Tform1:::Button1Click (TObject*Sender)

    {

    int FileHandle;               //файл дескрипторы

    int FileLength;               //файл ұзындығы

       int BytesRead;                //оқылған байттар саны

    char * Buffer;                 //файлға қол жеткізуді ашу

    FileRead=FileOpen (“1.txt”, fmOpenRead);

    if (FileHandle==-1)

    {

    ShowMessage (“1.txt файлын ашудағы қателік”);       

    exit;

    }

    FileLength= FileSeek (FileHandle, 0,2);     //файл ұзындығын оқу

    FileSeek (FileHandle, 0,0);                         //сілтегішті басына орналастыру

    Buffer=new char [FileLength+1];               //орынды алып қою

    //файлдан  деректерді оқу

    BytesRead= FileRead (FileHandle, Buffer, FileLength);

    FileClose (FileHandle);     //файлға қол жеткізуді жабу

    //жаңа  файлды құру

    FileHandle= FileCreate (“2.txt”)

    //буферден  деректерді жаңа файлға жазу

    int Res= FileWrite (FileHandle, Buffer, BytesRead);

    FileClose (FileHandle);             //файлға қол жеткізуді жабу

    delete [ ] Buffer;                       //буферді босату

    Каталогтармен және файлдармен жұмыс жасау үшін келесі функциялар қолданылады:

  • bool DirectoryExists (const AnsiString Directory); -кіріс параметрімен берілген каталогтың бар-жоқтығын анықтайды. Егер бар болса, true, ал жақ болса – false деп қайтарады.
 
  • AnsiString GetCurrentDir ( ); -ағымдық каталогқа толық жолды  қайтарады.
  • Bool SetCurrentDir (const AnsiString Dir); - Dir параметрінде көрсетілген ағымдық каталогты орнатады.
  • void ChDir (const AnsiString S); -ағымдық каталогты S-та көрсетілген каталогпен алмастырады.
  • bool CreateDir (const AnsiString Dir); -жаңа каталогты құрады.
  • bool RemoveDir (const AnsiString Dir); -бос каталогты жояды.
  • bool DeleteFile (const AnsiString File Name); -файлды жояды.
  • boolRename File (const AnsiString Old Name, const AnsiString New Name); -файлдың атын өзгертеді.

    Файлдарды параметрлеріне қарай іздеу үшін SYSUtils.h: cипатталған құрылым қолданылады.

    struct TSearchRec

    {

    int Time;

    int Size;

    int Attr;

    AnsiString Name;

    int FindHandle;

    char [4097] FindData;

    char [257] Pattern;

    } 

    Іздеу үш функцияның көмегімен жүзеге асырылады.

  • int FindFirst (const AnsiString Path, int Attr, TSearchRec &F); - Attr|-да көрсетілген атрибуттары бар файлдың алғаш рет енуін іздейді. Іздеу нәтижесі үшінші параметрде көрсетілген құрылымға орналастырылады.
  • int FindNext (TSearchRec &F); - FindFirs алдыңғы функциясында көрсетілген параметрлері бар файлдың келесі енуін іздейді.
  • void FindClose (TSearchRec &F); - FindFirs көрсетілген параметрлер бойынша іздеу амалдарын аяқтайды.

    Мысал. Файлдарды іздестірейік. Файлдардың аттары мен өлшемдері Memo компонентіне жазылатын болады.

    void_ _fastcall Tform1:::Button1Click (TObject*Sender) 

    {

    TSearchRec sr;

    int Attr=0;

    Memo1->Lines->Clear ( );

    Attr| =faReadOnly;

    Attr| =faHidden;

    Attr| =faSysFile;

    Attr| =faVolumeID;