-->
Главная » Статьи » Информатика

ФАЙЛҒА ҚАТЫНАС ЖАСАУ.

ФАЙЛҒА ҚАТЫНАС ЖАСАУ.

 

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

Келесі қадам – алдын-ала программаға қосылған, файлға қатынас жасай алатындай программаны жазып үйрену.

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

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

FILE * fp;

FILE * fopen(char*name, char* mode);

Осы жазбадан fp FILE-ға көрсеткіш екені шығады, ал fopen FILE-ға көрсеткішті қайтарады. FILE құрылым тегі емес, типтің аты екенін ескерген жөн.

Программада fopen-ге қатынас жасау, программада келесі түрде болады:

fp= fopen ( name, mode);

Бірінші аргумент – стринг файл атынан тұрады, екінші ереже туралы ақпаратты алып жүреді.

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

Файлдан оқу мен файлға жазудың бірнеше тәсілдері бар. Ең қарапайымы getc және putc функцияларын қолдану.  int getc ( FILE*fp) функциясы с литерін *fp файылына жазады және қате болған жағдайда, жазылған литерді немесе EOF-ті қайтарады.

Си программасын жүктеуде операциялық жүйелер әрқашан үш файлды ашады және оларға үш файлдық сілтемені қамтамасыз етеді. Бұл файлдар: стандартты енгізу, стандартты шығару және қателердің стандартты файлы болып табылады; оларға сәйкес көрсеткіштер stdin,stdout және stderr деп аталады, олар < stdio.h>-та сипатталған.

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

     int fscanf( FILE*fp, char * format,…)

     int fprintf( FILE*fp, char * format,…)

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

# include <stdio.h>

main ( int argc,char*argv[])

{  FILE *fp;

   void filecopy ( FILE*,FILE*);

   if ( argc= = 1)                         // аргументтер жоқ, стандартты енгізу көшіріледі.

   filecopy ( stdin, stdout);

   else

                while ( - -argc >0)

             if (( fp = fopen( * + + argv, "r”))= = NULL)

             { printf ( "cat : % s\n”,*argv файлын аша алмаймын);

                return 1;

              }

                 else

                      { filecopy ( fp,stdout);

                         fclose(fp);

                      }

             return 0;

}

//filecopy : ifp файлын ofp файлына көшіреді.

void filecopy (FILE*ifp, FILE*ofp)

{  int c;

       while (( c=getc ( ifp))!=EOF)

             putc ( c,ofp);

}

stdio және stdout файлдық көрсеткіштер FILE* типті объектілерді көрсетеді. Бұл айнымалылар емес тұрақтылар, сәйкесінше оларға ешнәрсені меншіктеуге болмайды.

int fclose ( FILE*fp) функциясы – fopen-ге қатысты керісіншесі; ол файлдық көрсеткіш пен сыртқы атаулардың арасындағы байланысты үзеді.

Біздің қарастырған программамызда қателерді өңдеуде файлдарды конкатенациялауды тамаша деп есептеуге болмайды. Мәселе, егер файл қандай-да бір себеппен қатынаса алмайтын болса, осы туралы хабарды біз шығарудың соңғы конкатенациялануында аламыз. Мұндай жағдай шыдарлық, егер шығару файлға немесе басқа программаға емес, тек экранға (қателер бірден көрінетіндей) тура "құбыр” бойымен жіберілсе.

Осы мәселені дұрыс шешу үшін, программаға стандартты stdout шығаруымен қатар stderr деп аталатын тағы бір шығу ағыны беріледі. Егер stderr-ге шығу басқа орынға бағытталса да stdout-ге шығуы әдетте экранға жіберіледі.

Конкатенация программасын қателер туралы хабар stderr-ге жіберілу үшін қайтадан жазамыз.

# include < stdio.h>

// файлдың конкатенциясы

main ( int argc, char * argv[])

{  FILE * fp;

   void filecopy ( FILE*, FILE*);

   char * prog = argv[0];                              // программа аты

   if ( argc= =1)                             // аргументер жоқ; стандартты енгізу көшіріледі

   filecopy ( stdin, stdout);

     else

          while ( - - argc > 0)

             if ((fp=fopen (* + + argv,”r”)) = = NULL)

             { fprintf ( stderr, "%s: файлын аша алмайды %s\n”, prog,*argv);

                exit(1) ;

             }

             else  {  filecopy ( fp, stdout);

                      fclose( fp);

                      }

             if ( ferror ( stdout))

             {  fprintf ( stderr, "%s: stdout\n”,prog жазбадағы қате);

                 exit (2);

             }

   exit (0);

}

Программа қателер туралы екі әдіспен сигнал береді. Біріншісі - fprintf көмегімен қате туралы хабар, ол экранға тура түсу үшін stderr-ге жіберіледі. Программаның prog аты қателерді анық түрде хабарлау үшін қосылады.

Қатені көрсетудің екінші тәсілі – программаның жұмысын аяқтайтын exit бибиотекалық функциясына қатынас жасау exit функциясының аргументі берілген процесті шақыратын кейбір процестерге жарамды. Яғни программаның табысты немесе қате аяқталуын осы программаны бағынышты процесс ретінде қарастыратын кейбір программалардың көмегімен бақылауға болады. Exit аргументінің 0-ден басқа барлық мәні қателерді хабарлайды.

Барлық ашылған шығару файлдары үшін жинақталған ақпараттардан буферді босату үшін, exit  функциясы fclose-ді шақырады.

Басты программада return нұсқауы (өрнек) exit функциясына (өрнек) айналдырумен эквивалентті.

exit көмегімен жазудың артықшылығы, ол басқа функциялардан шығу үшін, ыңғайлы сол сияқты оны оңай табуға болады.

int ferror ( FILE*fp) функциясы, егер fp файлында қате болса, нөлдік мәнді береді.

int feof ( FILE*) функциясы, егер файлдың көрсетілген аргументтерінің соңы кездессе, нөлдік емес мәнді қайтарады.

Стандартты библиотекада fgets енгізу функциясы бар

   char * fgets (char*line, int maxline, FILE*fp),

ол maxline-ен 1 литерден артық оқи алмайды, line литер массивінде fp файлынан келесі енгізу жолдарын оқиды (литердің жаңа жолын қоса алғанда). Жазылған жол ‘\0’ литерімен толықтырылады.

fputs шығару функциясы стрингті файлға жазады (литердің жаңа жолымен аяқталмауыда мүмкін).

   int fputs ( char*line, FILE*fp).

gets және puts библиотекалық функциялардың fgets және fputs-ден айырмашылығы, олар тек stdin және stdout стандартты файлдарын пайдаланады, сол сияқты gets соңғы ‘\n’ литерді алып тастайды, ал puts оны қосады.

Категория: Информатика | Добавил: admin_ (17.11.2013)
Просмотров: 924 | Теги: ФАЙЛҒА ҚАТЫНАС ЖАСАУ. с++ қазақша | Рейтинг: 0.0/0
Всего комментариев: 0

Имя *:
Email:
Код *: