Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП для экзаменов.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
288.26 Кб
Скачать

4.Файлдармен жұмыс

Файл – сыртқы есте сақтау құрылғыларында (магниттік дискі­лерде) орналастырылған және мәлімет өңдеу, тасымалдау кездерінде біртұтас күйде қарастырылатын мәліметтер жиыны.

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

Си тілінде файл ашу fopen() функциясы арқылы орындалады. Ол сыртқы құрылғыдағы физикалық файлды, мысалы, А:\NUR.DAT, прог­рам­мадағы оның логикалық атымен байланыстырады. Логикалық ат дегеніміз – файлға нұсқауыш, яғни файл туралы мәлімет сақталатын жады аймағына сілтеме жасау. Файлға нұсқауыш сипатталуы тиіс.

Сонымен, файлдармен жұмыс істегенде нұсқауыштар қолда­ны­ла­ды. Файл­ға нұсқауыш мынадай түрде сипатталады:

FILE  *fp;

мұндағы FILE типі – <stdio.h>тақырыптық файлында анықталған құрылым. Бұл нұсқауышты көрсетілген файлмен сол файл ашыл­ған­нан бастап, байланыстырып қоюға болады. Ол үшін келесі функция пайдаланылады:

fopen ("файл адресі/аты","қатынасу типі");

ол файлға нұсқауыш мәнін қайтарады немесе қате болса, NULL мәнін береді.

Мысалы, мынадай оператор орындалуы нәтижесінде

fp = fopen ("ex1.txt", "w");

жұмыс бумасындағы ex1.txt файлы оған мәлімет жазу (write) үшін ашылады, ал прог­раммада бұл файлды fp нұсқауышы арқылы пайда­ланамыз (яғни fopen() функциясы файлдың сыртқы атын оның прог­раммада қолданы­латын ішкі логикалық атымен байланыстырады).

Сонымен, файлды ашатын  fopen() функцияcының жалпы жазы­луы:

fp = fopen(name,mode)

мұнда fp – файлға сілтейтін нұсқауыш; name – файлдың адресін де көрсетуге болатын аты, көбінесе символдық тіркес арқылы жазылады; mode –  файл қандай режимде қолданылатынын көрсе­те­тін параметр, бұл да символдар тіркесімен төмен­дегідей түрде жазылады:

"r" – файлды оқу үшін ашу (файл бұрын ашылған болуы тиіс);

"w" – бос файлды информация жазу үшін ашу;

"a" – файл соңына мәлімет қосып жазу үшін оны ашу;

"r+"– файлдан информация оқу және оған информация жазу үшін ашу);

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

"a+"– файлдан информация оқу және оның соңына информация қосып жазу үшін ашу).

"t"  –   файл мәтіндік (текстік) режимде ашылады, ол rt, wt, at, т.с.с. болып көрсетіле береді.

"b" –  файл екілік режимде  ашылады, rb, wb, ab, т.с.с. болып көрсетіле береді.

Келісім бойынша файл көбінесе мәтіндік режимде ашылады.

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

fclose(файл_нұсқауышы).

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

fprintf(), fscanf(), fputs(), fgets(), getc(), putc(), fgetc(), fputc().

Бұлардың ішіндегі getc()/fgetc(), putc()/fputc() функ­циялары әрекеттері ұқсас, айырмашылықтары тек getc() пен putc() макроанықтаулар да, aл fgetc() және fputc() – нағыз функциялар болып табылады.

Барлық файлдық функциялар прототиптері <stdio.h> файлында орналасқан.

Файлдардан мәлімет жазу/оқу әрекеттерін үш топқа бөлуге болады:

- символдарды енгізу/шығару операциялары;

- сөз тіркестері жолдарын енгізу/шығару операциялары;

- блок бойынша енгізу/шығару операциялары.

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

fgetc(FILE *fp);                ашылған файлдан символ оқиды.

fputc(int ch,FILE *fp);     ch символы кодын файлға жазады.

Сөз тіркестері жолдарын енгізу/шығару операцияларында бір мәлімет алмасуы кезінде файлдан сөз тіркесі жолдары оқылады немесе оған сөз тіркесі жазылады. Мысалы:

gets(char *S);  файлдан мәлімет байттарын '\n' символы кездес­кенше біртіндеп оқиды да, оларды  S тіркесіне орналастырып, '\n' сим­волын ‘\0’ (нөл-терминатор) белгісіне айналдырады.

fgets(char *S,int m,FILE *fp);    fp түрінде сипаттал­ған файл­­дан байттарды оқып, оларды '\n' символы кездескенше немесе m байт оқылып біткенше S тіркесі мәні ретінде жазып шығады.

Блок бойынша енгізу/шығару операцияларында мәліметтер алмасу олардың бір блогын толық қамтиды. Мысалы:

   fread (void *ptv, int size, int n, FILE *fp); 

мұнда fp файлынан әрқайсысы size байттан тұратын мәліметтің  n блогы ptv нұсқауышы көрсетіп тұрған жады аймағына оқылады (оқы­ла­тын блок үшін алдын ала орын дайындап қою қажет).

fwrite (void *ptv, int size, int n, FILE *fp);

мұнда ptv нұсқауышы көрсетіп тұрған жады аймағында орналасқан  әрқайсысы size байттан тұратын мәліметтің  n блогы ашық тұрған fp файлына жазылады.

fprintf және fscanf функцияларын пайдалану

fprintf - файлға информация жазу үшін, ал  fscanf – файлдан информация оқу үшін қолданылады. Олардың жалпы жазылу түрі:

fprintf(fp, “спецификация шаблоны”,p);

мұндағы p-өрнек;

fscanf(fp, “спецификация шаблоны”,адрес);

Мысал: Бүтін сандар тізбегін n=5 пернелерден енгізіп, оларды файлға жазу керек болсын.

// файл ашып, оған 5 сан жазу

#include <stdio.h>

#include <conio.h>

main()

{ int k,i,n=5;

  char fname[]="a:\\num.txt\0";

  clrscr();

  FILE *fp;

  fp=fopen(fname,"w");

  clrscr();

  printf("Енгізілген сандар %s файлына жазылады\n",

          fname);

  puts("Әр сан енгізілген соң, Enter басыңыз\n");

  for(i=0; i<n;i++)

  {scanf("%i",&k);

   fprintf(fp,"%d ",k);

  }

  fclose(fp);

  printf("Енгізілген сандар %s файлына жазылды\n",

          fname);

  getch();

}

Нәтижесі:

Енгізілген сандар a:\num.txt файлына жазылады

Әр сан енгізілген соң, Enter басыңыз

1

2

3

4

5

Енгізілген сандар a:\num.txt файлына жазылды

Файлдағы мәлімет: 1 2 3 4 5

 

fgets және fputs функцияларын пайдалану

Сөз тіркестерімен жұмыс істегенде fgets және fputs функция­лары қолданылады:

fgets функциясының жалпы жазылу түрі:

fgets(нұсқауыш,MAXLEN,fp);

нұсқауыш – ЭЕМ жадындағы орынға сілтейтін нұсқауыш; MAXLEN – оқылатын тіркестің максимальды ұзындығы; fp - файл нұсқауышы.

Мысалы:

#define L 20

main()

{

  FILE *fp;

  char *st[n];

  fp=fopen(“stroka”,”r”);

  while(fgets(st,L,fp)!=NULL)

puts (st);

}

Файлдарға сөз тіркестерін жазу үшін  fputs функциясы келесі түрде қолданылады:

status=fputs(қатар нұсқауышы,fp);

status – бүтін сан, оның мәні eof функциясында жазылады, егер fputs()функциясы файлдың соңына шыққан болса немесе қате тап­­са, fputs функциясы жазылатын жолдың соңына /0символын жаз­байды.

Төменде осы функцияларды пайдалану мысалы келтірілген.

#include <stdio.h>

void main ()

{

int n;

char str[50], str1[50], ch;

FILE *fp;

// Файлға мәлімет жазу

fp = fopen("ex.txt","w");

puts ("Бүтін сан енгізіңіз: "); scanf("%d",&n);

fprintf (fp, "%d\n", n) ;

puts ("Символ енгізіңіз: "); ch=getchar();

putc (ch, fp);

puts ("Сөз тіркесін енгізіңіз: "); gets(str);

fputs(str, fp);

fclose(fp);

// Файлдан мәлімет оқу

if((fp = fopen("ex.txt","r")) != NULL)

 {

 fscanf (fp, "%d", &n); printf ("n=%d\n", n) ;

 ch = getc (fp); putchar (ch);

 fgets(str1, 50, fp); puts (str1);

 fclose (fp);

 }

 else printf ("\nФайлдан мәлімет оқылмайды!");

}

Мұндағы fgets()функциясының екінші параметрі N – оқылатын символдар саны, оған '\0' белгісі де қосылады.Бұл функция өз жұмы­сын N-1 символын оқығаннан кейін немесе '\0' белгісі кездес­кенде аяқтайды. Екеуінде де сөз тіркесі соңына '\0' белгісі қосылады. fgets() функциясы оқылған сөз тіркесі адресін қайтара­ды немесе файл оқылып болғанда (не қате шықса), NULL белгісін береді.

fputs()функциясы әрекет дұрыс орындалса, соңғы оқылған сим­вол кодын қайтарады, ал қате болса,  EOF (файл соңы) белгісін бер­е­ді. Бұл функция курсорды автоматты түрде келесі жолға көшір­мейді.

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

    fseek(файлға нұсқауыш,бастапқы нүктеден ығысу, бастапқы нүкте);

Екінші аргумент типі long, оның мәні оң да, теріс те болуы мүм­кін. Ол бастапқы нүктеден қанша орынға (байтпен) ығысу керек екендігін көрсетеді. Үшінші аргумент файлдағы бастапқы нүкте орнын анықтайтын код болып табылады. Осы код үшін мынадай мәндер тағайындалған:

0  - файл басы;

1  - ағымдағы позиция;

2  - файл соңы.

Дұрыс орындалғанда, fseek()функциясы 0 мәнін береді, ал егер қате (мысалы, файлдың сол жақ шекарасынан ары аспақшы болғанда) болса, онда  -1 береді.

fwrite және fread функцияларын пайдалану

Құрылымдарды пайдаланатын файлдармен жұмыс істеу кезінде  fread()/fwrite()функцияларын пайдаланған ыңғайлы. Олардың жазылуы:

fread(ptr,size,n,fp);

мұнда fp файлынан әрқайсысы size байттан тұратын мәліметтің  n блогы ptv нұсқауышы көрсетіп тұрған жады аймағына оқылады (оқылатын блок үшін алдын ала орын дайындап қою қажет).

fwrite (ptr,size,n,fp);

мұнда ptr нұсқауышы көрсетіп тұрған жады аймағында орналасқан  әрқайсысы size байттан тұратын мәліметтің  n блогы ашық тұрған fp файлына жазылады.

Осы функцияларды қолданудың бір мысалын келтірейік:

typedef struct

{

  char author [30];

  char title [50];

  int pages;

} BOOK;

BOOK b1={"Kernighan", "С Language", 256},b2;

FILE *fp;

void main()

{...

 fp=fopen("struct.txt", "w+");

// файл әрі оқу, әрі жазу үшін ашылды

 fwrite(&b1, sizeof(BOOK), 1, fp);

 fseek(fp,0,0); // маркерфайл басына

 fread(&b2, sizeof(BOOK), 1, fp);

 printf("Авторы – %s,аты – %s,беттер саны –

        %d\n",b2.author, b2.title, b2.pages);

}