Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C _Учебник_МОНУ

.pdf
Скачиваний:
206
Добавлен:
12.05.2015
Размер:
11.12 Mб
Скачать

Файли

389

void __fastcall TForm1::FormCreate(TObject *Sender)

{// Перевіряється наявність файла на диску: якщо файл є,

//то він відкривається для зчитування і записування, а якщо немає –

//то створюється для зчитування і записування. if(FileExists(s)) f = fopen(s,"rt+");

else f = fopen(s,"wt+"); fclose(f);

}

// Кнопка “Дописати до файла”

void __fastcall TForm1::Button1Click(TObject *Sender)

{if((f=fopen(s,"at"))==NULL)

{ ShowMessage("Файл не вдається відкрити"); return; } char nazva[15];

strcpy(nazva, Edit1->Text.c_str()); float price = StrToFloat(Edit2->Text); int kol = StrToInt(Edit3->Text);

// Дописування даних здійснюється в кінець файла fprintf(f, "%s %6.2f %i\n", nazva, price, kol); fclose(f);

Edit1->Clear(); Edit2->Clear(); Edit3->Clear(); Edit1->SetFocus();

}

// Кнопка “Переглянути файл”

void __fastcall TForm1::Button2Click(TObject *Sender) { float price; int kol; char nazva[15]; if((f=fopen(s,"rt+"))==NULL)

{ ShowMessage("Файл не вдається відкрити"); return;

}

Memo1->Clear();

// Контроль досягання кінця файла здійснюється функцією feof(f) while (!feof(f))

{// Порядкове зчитування з файла

fscanf(f,"%s %f %i\n",&nazva,&price,&kol); AnsiString str=nazva;

for(int i=str.Length();i<=15; i++)str+=" ";

// Виведення даних здійснюється за форматом

Memo1->Lines->Add(str+" "+FloatToStrF(price,ffFixed,6,2)+ " "+IntToStr(kol));

}

fclose(f);

}

// Кнопка “Товари, кількість яких є менше за 30”

void __fastcall TForm1::Button3Click(TObject *Sender)

{if((f=fopen(s,"rt"))==NULL)

{ShowMessage("Файл не вдається відкрити "); return; }

Memo2->Clear(); char nazva[15];

float price; int kol;

390

Розділ 12

while(!feof(f))

{fscanf(f,"%s %f %i\n",&nazva,&price,&kol);

if (kol<30)Memo2->Lines->Add(AnsiString(nazva)+" "

+FloatToStrF(price,ffFixed,6,2)+" "+IntToStr(kol));

}

fclose(f);

}

// Кнопка “Визначити назву та розмір файла”

void __fastcall TForm1::Button4Click(TObject *Sender)

{long length; if((f=fopen(s,"rt"))==NULL)

{ShowMessage("Файл не вдається відкрити"); return; } fseek(f, 0, SEEK_END);

length = ftell(f);

fclose(f); Edit4->Text=s;

Edit5->Text=IntToStr(length);

}

Приклад 12.2 Увести до текстового файла рядки символів. Прочитати дані з файла і з‟ясувати, скільки разів зустрічається у файлі слово, яке вводиться з клавіатури.

Форма додатка з результатами роботи матиме вигляд

Текст програми:

#include <stdio.h> FILE *f;

int flag;

Файли

391

void __fastcall TForm1::FormCreate(TObject *Sender) {// Перевірка наявності файла на диску і визначення розміру файла

if(FileExists("str.txt")) f=fopen("str.txt","rt+"); else f=fopen("str.txt","wt+");

fseek(f,0,2); flag=ftell(f); // Визначення розміру файла fclose(f);

}

// Кнопка “Дописати рядок”

void __fastcall TForm1::Button1Click(TObject *Sender)

{f=fopen("str.txt","at"); char s[80];

strcpy(s, Edit1->Text.c_str());

fprintf(f,"%s\n",&s);

fclose(f);

flag=1;

}

// Кнопка “Прочитати файл”

void __fastcall TForm1::Button2Click(TObject *Sender)

{if (flag==0)

{ ShowMessage("Файл є порожній!\nНемає чого читати!");

return;

}

else Memo1->Lines->LoadFromFile("str.txt");

}

// Кнопка “Підрахувати кількість шуканих слів у файлі”

void __fastcall TForm1::Button3Click(TObject *Sender) { char s[80], key[20]; int k=0;

strcpy(key,Edit2->Text.c_str());//Зчитування шуканого слова з Edit2 if ((f=fopen("str.txt","rt"))==NULL)

{ ShowMessage("Неможливо прочитати файл"); return;

}

char *str = " ,.:;!?" ; // Рядок з розділювачами слів while (fgets(s,80,f))

{ if(s[strlen(s)-1]=='\n') s[strlen(s)-1]= '\0';

char *p=new char [strlen(s)+1]; // Виокремлення з рядка окремих слів p=strtok(s,str);

while (p!=NULL)

{if(!strcmp(p,key)) k++; p=strtok(NULL,str);

}

}

Edit3->Text=IntToStr(k); fclose(f);

}

392

Розділ 12

Приклад 12.3 Увести рядки до компонента Мемо і записати їх до файла. прочитати дані з файла і відобразити їх в іншому Мемо. Визначити:

довжину кожного рядка;

впорядкованість за зростанням довжин рядків (вивести відповідне повідомлення);

суму всіх додатних цілих чисел, що зустрічаються;

надати можливість обнулити файл (вилучити вміст файла).

Форма додатка з результатами роботи матиме вигляд

Текст програми:

#include <stdio.h>

FILE *f; char fn[]="pr.txt"; // Кнопка “Записати до файла”

void __fastcall TForm1::Button1Click(TObject *Sender)

{f=fopen(fn,"wt");

if(f==0) { ShowMessage("Не відкритий!"); return; } char s[40]; int n=Memo1->Lines->Count;

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

{if(Memo1->Lines->Strings[i]=="") continue; strcpy(s,Memo1->Lines->Strings[i].c_str());

strcat(s,"\n");

fputs(s,f);

}

fclose(f);

}

// Кнопка “Прочитати файл”

void __fastcall TForm1::Button2Click(TObject *Sender) { char s[40]; Memo2->Clear();

f=fopen(fn,"rt+");

if(f==0) {ShowMessage("Неможливо прочитати файл"); return;} while(fgets(s,40,f))

{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0'; Memo2->Lines->Add((AnsiString) s);

}

Файли

393

fclose(f);

}

// Кнопка “Обчислити довжину кожного рядка”

void __fastcall TForm1::Button3Click(TObject *Sender)

{char s[40]; int dl; Memo3->Clear();

f=fopen(fn,"rt+");

if(f==0) {ShowMessage("Неможливо прочитати файл");return;} while (fgets(s,40,f))

{ if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0';

dl=strlen(s); Memo3->Lines->Add(IntToStr(dl));

}

fclose(f);

}

// Кнопка “Визначити впорядкованість рядків”

void __fastcall TForm1::Button4Click(TObject *Sender)

{char s[40]; int dl1,dl2;

f=fopen(fn,"rt+");

if(f==0) {ShowMessage("Неможливо прочитати файл");return;} fgets(s,40,f);

if(ftell(f)>0)

{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0'; dl1=strlen(s);

int flag=0;

while (fgets(s,40,f))

{if (s[strlen(s)-1]=='\n') s[strlen(s)-1]='\0'; dl2=strlen(s);

if (dl1>dl2){flag=1; break;} dl1=dl2;

}

if(flag==0)ShowMessage("Рядки впорядковано за зростанням!"); else ShowMessage("Рядки не впорядковано!");

}

fclose(f);

}

// Кнопка “Обчислити суму додатних цілих чисел”

void __fastcall TForm1::Button5Click(TObject *Sender)

{char s[40];

if ((f=fopen(fn,"rt"))==NULL)

{ShowMessage("Неможливо прочитати файл"); return; } int num, sum=0;

char *str=" ,.:;!?" ; while(fgets(s,40,f))

{if(s[strlen(s)-1]=='\n') s[strlen(s)-1]= '\0'; char *p=new char [strlen(s)+1]; p=strtok(s,str);

394

Розділ 12

while(p!=NULL)

{num=atoi(p);

//Функція atoi() повертає число, якщо рядок р складається з цифр, або 0 sum+=num;

p=strtok(NULL,str);

}}

Label2->Caption="Сума чисел дорівнює "+IntToStr(sum); fclose(f);

}

// Кнопка “Обнулити файл”

void __fastcall TForm1::Button6Click(TObject *Sender)

{f=fopen(fn,"wt");

if(f==0) {ShowMessage("Не відкритий!");return;} fclose(f);

}

Приклад 12.4 Увести дані про автобусні маршрути по автостанції: напрямок маршруту, час відправлення та прибуття, період чинності даного розкладу за напрямками, ціна квитка. Записати дані до текстового файла і виконати такі завдання:

вивести всі дані з інформацією про тривалість подорожі;

вивести відомості про маршрути “Одеса – Київ”, якщо цей розклад буде чинним ще 45 днів від поточного дня;

віднайти маршрут “Одеса – Варна”, для якого можливе прибуття до Варни після 17:00 і щонайближче до півночі.

Примітка. Вводити дані щодо напрямку маршруту треба без пропусків або сполучати за допомогою символу “підкреслення”.

Можливий варіант робочої форми може мати вигляд

Файли

395

Текст програми:

#include <stdio.h>

// Оголосимо глобальні змінні

FILE *f;

char *fn="a.txt";

char npr[50], totp[9], tpri[9], dot[11], dpri[11]; float cena;

void __fastcall TForm1::FormCreate(TObject *Sender)

{SG1->RowCount=2; SG1->Cells[0][0]="№"; SG1->Cells[1][0]="Напрям"; SG1->Cells[2][0]="Час відпр"; SG1->Cells[3][0]="Час приб"; SG1->Cells[4][0]="Чинний є з" ; SG1->Cells[5][0]="Чинний є до"; SG1->Cells[6][0]="Ціна квит";

SG1->Cells[7][0]="Час в дорозі";

}

// Кнопка “Дописати до файла”

void __fastcall TForm1::Button1Click(TObject *Sender)

{f=fopen(fn,"at+");

if (f==0) { ShowMessage("Не відкрито!"); return; } strcpy(npr,Edit1->Text.c_str()); strcpy(totp,Edit2->Text.c_str()); strcpy(tpri,Edit3->Text.c_str()); strcpy(dot,Edit4->Text.c_str()); strcpy(dpri,Edit5->Text.c_str()); cena=StrToFloat(Edit6->Text);

fprintf(f,"%s %s %s %s %s %5.2f\n", npr,totp,tpri,dot,dpri,cena);

fclose(f);

}

// Кнопка “Переглянути дані з файла”

void __fastcall TForm1::Button2Click(TObject *Sender)

{f=fopen(fn,"rt+");

if(f==0){ShowMessage("Файл не відкритий!");return;}

int i=0; // Порядковий номер маршруту while(fscanf(f,"%s %s %s %s %s %f",

&npr,&totp,&tpri,&dot,&dpri,&cena)>0)

{i++; SG1->Cells[0][i]=IntToStr(i); SG1->Cells[1][i]=npr; SG1->Cells[2][i]=TTime(totp); SG1->Cells[3][i]=TTime(tpri); SG1->Cells[4][i]=TDate(dot); SG1->Cells[5][i]=TDate(dpri);

SG1->Cells[6][i]= FormatFloat("0.00",cena); SG1->Cells[7][i]=TTime(tpri)-TTime(totp);

396

Розділ 12

SG1->RowCount=i+1;

}

fclose(f);

}

// Кнопка “Маршрути “Одеса_Київ”, які діятимуть ще 45 днів” void __fastcall TForm1::Button3Click(TObject *Sender)

{String napr; f=fopen(fn,"rt+");

if(f==0){ShowMessage("Файл не відкрито!");return;}

Memo1->Clear();

while(fscanf(f,"%s %s %s %s %s %f", &npr,&totp,&tpri,&dot,&dpri,&cena)>0)

{napr=&npr[0];

if ((napr=="Одеса_Київ")&& (TDate(Date()+45)<TDate(dpri)))

Memo1->Lines->Add(AnsiString(npr)+" "+totp+" "+ tpri+" "+(TTime(tpri) - TTime(totp)));

}

fclose(f);

}

//Кнопка “Маршрут “Одеса_Варна” з прибуттям до Варни щонайближче до півночі” void __fastcall TForm1::Button4Click(TObject *Sender)

{Memo2->Clear();

// Обмеження часу прибуття становить 17:00.

TTime Ttmin=TTime("17:00"); AnsiString s; f=fopen(fn,"rt+"); if(f==0)

{ ShowMessage("Файл не відкрито!"); return;} while(fscanf(f,"%s %s %s %s %s %f",

&npr,&totp,&tpri,&dot,&dpri,&cena)>0)

{ if(AnsiString(npr)=="Одеса_Варна") if(TTime(tpri)>(Ttmin))

s = AnsiString(npr)+" "+ AnsiString(totp)+" "+ AnsiString(tpri)+" "+FormatFloat("0.00",cena);

Ttmin=TTime(tpri);

}

Memo2->Lines->Add(s);

fclose(f);

}

// Кнопка “Обнулити файл”

void __fastcall TForm1::Button5Click(TObject *Sender)

{f=fopen(fn,"wt");

if(f==0)

{ShowMessage("Файл не відкрито!");

return;

}

fclose(f);

}

Файли

397

Введення даних до файла з числового масиву

Для записування елементів числового масиву до файла існує дві можли-

вості.

1) Перетворити елементи масиву на С-рядки, які записати до файла за допомогою функції fputs(). Наприклад, записування до файла цілочисельного масиву з 10-ти елементів:

char s[80];

for(int i=0; i<10; i++)

{ itoa(a[i],s,10);

// Перетворення елемента на С-рядок,

strcat(s, "\n");

// долучення символу переведення на новий рядок

fputs(s, f);

// і записування елемента до файла.

}

 

У цьому прикладі кожен елемент перетворюється на рядок окремо від інших за допомогою функції atoi() (докладніше про цю функції див. розд. 7) і записується до файла. В результаті всі числа масиву буде записано до файла у стовпчик. За потреби записувати елементи в один рядок через пробіл слід змінити тіло циклу в такий спосіб:

for(int i=0; i<10; i++)

{ itoa(a[i], s, 10);

// Перетворюємо елемент на С-рядок,

strcat(s, " ");

// додаємо пробіл після чергового числа

fputs(s, f);

// і записуємо число з пробілом до файла.

}

 

fputs("\n", f);

 

Якщо кількість елементів є не надто велика, можна спочатку створити рядок, до якого записати через пробіл всі елементи, а тоді записати цей рядок до файла:

char s[80]="", s1[10];

for(int i=0; i<10; i++) // До рядка долучається черговий елемент

{ itoa(a[i], s1, 10); strcat(s, s1); } // у символьній формі strcat(s, "\n");

fputs(s, f);

2) Записати елемент до файла за допомогою функції форматованого введення даних fprintf():

for(int i=0; i<10; i++) fprintf(ft,"%6.2f\n", a[i]);

Також матрицю до файла можна записати у такі способи.

1) Кожен елемент матриці перетворити до С-рядка і записати до файла окремо, після завершення кожного рядка матриці приєднати символ <Enter>:

for(int i=0; i<10; i++)

{for(int j=0; j<10; j++)

{ itoa(a[i][j],s,10);// Перетворення числа на С-рядок,

strcat(s,"\t");

// долучення табуляції після чергового числа

fputs(s,f);

}

// і записування числа з пробілом до файла

fputs("\n",f);

//Записування символу переведення курсора у кінець рядка

}

398

Розділ 12

2) Сформувати С-рядок з елементів кожного рядка матриці й записати його до файла:

char s[80]="";

for(int i=0; i<10; i++)

{for(int j=0; j<10; j++)

{ itoa(a[i][j],s,10);// Перетворення елемента на С-рядок,

strcat(s, "\t"); // долучення табуляції після чергового числа

}

strcat(s, "\n");// і символу переведення позиції на кінець рядка fputs(s, f); // Записування рядка матриці до файла

}

3) Кожен елемент матриці записати до файла у числовій формі за допомогою функції fprintf():

for(int i=0; i<10; i++)// Записування елемента

{ for(int j=0; j<10; j++) fprintf(ft,"%6.2f\n",a[i][j]);

fputs("\n", f);

// і символу переведення курсора у кінець рядка

}

 

Зверніть увагу на те, що функція itoa() перетворює ціле число на рядок. Для перетворення дійсних чисел на рядок можна перетворити число спочатку на AnsiString за допомогою однієї з відповідних функцій перетворювання, а тоді вже перетворити його на С-рядок.

Приклад 12.5 Заповнити матрицю 5 5 випадковими числами і записати цю матрицю до текстового файла.

Текст програми:

#include <stdio.h> float a[5][5]; FILE* f;

void __fastcall TForm1::Button1Click(TObject *Sender) { int i,j,c; char s[100];

randomize(); for(i=0; i<5; i++) for(j=0; j<5; j++)

{ StringGrid1->Cells[j][i]=((1000-random(2000))/10.); a[i][j]=StrToFloat(StringGrid1->Cells[j][i]);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]