упражнение №7

 

Файлове

 

Файлът е структура от логически свързани и еднотипни данни (елементи) за съхраняване на външно запомнящо устройство. Броят на елементите на файла не се указва, т.е. практически е неограничен.

В С++ има последователни файлове и файлове с произволен достъп.

При файловете с последователна организация достъпът е в същия ред, в който е създаден файлът. Да се вмъкнат данни по средата на такъв файл може само ако разделим файла в два други помощни и след това отново ги обединим, като междувременно вмъкнем и новите данни.  Много трудно бихме могли да изтрием или променим информация в последователен файл. Единствения начин за обновяване на данните е да се създаде нов файл, в който да препишем старите данни и междувременно да отразим промените.

При файловете с произволен достъп можем да обработваме кой да е запис без да сме прочели предходните. За това те са по-гъвкави.

При работа с външни файлове трябва да се спазва следната структура:

1)    деклариране на файлов указател;

2)   отваряне на файла;

3)   обработка на файла;

4)   затваряне на файла.

Обекта файлов указател може да бъде от тип ofstream (за запис) или ifstream (за четене), дефинирани в заглавния файл fstream.h.

Отварянето на файла се подчинява на следния синтаксис:

Файлов указател.open ( име на файл ,  режим на достъп )               ,

а затварянето – на следния синтаксис:

Файлов указател .close( )              .

 име на файл   - символен низ, който съдържа името на файла. Ако не е указан пътят до него се търси в текущата папка.

режим на достъп - може да бъде някой от следните стойности, принадлежащи на обекта ios:

app

за допълване

ate

позиционира показалеца в края на файла

in

за четене

out

за запис

binary

двоичен режим

tranc

изтрива съдържанието на файла, ако той съществува

nocreate

отваря само съществуващи файлове

noreplace

ако файла съществува може само да бъде допълван.

 

Достъпът по подразбиране е текстов. Текстовият файл е ASCII файл, съвместим с текстовите файлове, създавани от други езици за програмиране. Не е задължително текстовият файл да съдържа текст в смисъл на текстов редактор.

Ако посочим метод на достъп binary, ще бъде създаден файл в двоичен формат. Този начин на съхраняване на данните е по-икономичен, но други програми вероятно няма да могат да четат данните. Двоичният формат е системно зависим. Файл, създаден на един компютър не винаги може да се прочете на друг компютър.

Ако отворим файл за запис (с метода out) С++създаванов файл. Ако такъв файл вече има, С++изтрива съдържанието му без предупреждение.

Ако при отварянето на файл възникне грешка, С++ не създава валиден файлов указател, а указател, равен на 0. Добре е с цел икономия на памет файловете да се отварят непосредствено преди използването им и да се затварят веднага след това. При отваряне да се проверява файловият указател и ако е нула ,да се издава съобщение за грешка.

 

Записът и четенето може се реализира с помощта на поточните оператори(<< и >>).

Пример1

ofstream fp;

fp.open(Danni.dat”, ios::out);

if(!fp)    cout<<”Файлът не може да се отвори за запис.”;

else      {

fp<<x<<’\t’<<y<<’\t’<<z<<’\n;// записва във файла стойностите на x, y, z

fp.close( );

}

 

Можем да отворим файл и като дефинираме обект съответно от тип ifstream (за четене) , ofstream ( за запис ) или fstream съответно за четене и запис по следния начин:

За четене:

ifstream име_на_обект(“име_на_файл”, ios::режим_на_четене);

 

За запис:

оfstream име_на_обект(“име_на_файл”, ios::режим_на_запис);

 

За четене и запис:

fstream име_на_обект(“име_на_файл”, ios::режим_на_четене| ios::режим_на_запис);

 

 

Пример2

 Да се напише програма, която въвежда от клавиатурата масив от цели числа, записва го във файл, прочита съдържанието на файл с цели числа и ги извежда на екрана.

 

#include <iostream.h>

#include <fstream.h>

void main()

{int x[10],i,n=3;

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

{cout<<"a=";cin>>x[i];}

fstream fp;

fp.open("c:/Danni.dat",ios::out);

if(!fp)      cout<<"can't open file.";

else

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

fp<<x[i]<<'\t';

fp.close();

fp.open("c:/Danni.dat",ios::in);

if(!fp)      cout<<"can't open file.";

else

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

{fp>>x[i];cout<<x[i]<<"\n";}

fp.close();

 

}

 

Пример3

 Да се напише програма, която отваря файл,  записва в него структури и прочита и извежда на екрана съдържанието му.

 

#include <iostream.h>

#include <fstream.h>

#include <string.h>

 

void main()

{ int n;

struct  student

{

char name[20],sname[20];

  float dipl ;

}a[100];

  do

  {cout<<"broi uchenici(1<=n<=100). n=";

  cin>>n;}

  while ( (n<1) ||(n>100));

 

cout<<"input student data "<<'\n';

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

{cout<<"name: "; cin>>a[i].name;

   cout<<"sname: "; cin>>a[i].sname;

   cout<<"dipl: "; cin>>a[i].dipl;}

 

               

fstream fp;

fp.open("c:/Danni2.dat", ios::in|ios::out);

if(!fp)      cout<<"can't open file.";

else        

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

{fp<<a[i].name<<'\n'<<a[i].sname<<'\n'<<a[i].dipl<<'\n';

strcpy(a[i].name,"");strcpy( a[i].sname,"");a[i].dipl=0;}

fp.close( );

fp.open("c:/Danni2.dat", ios::in|ios::out);

if(!fp)      cout<<"can't open file.";

else        

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

fp>>a[i].name>>a[i].sname>>a[i].dipl;

fp.close( );

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

cout<<"\nime["<<i<<"]="<<a[i].name<<"\nsime["<<i<<"]="<<a[i].sname<<"\ndipl["<<i<<"]="<<a[i].dipl;

}

задачи за упражнение:

 

Задача 1. Да се създаде нов файл Names.dat на диска С и в него да се запишат 5 имена, въведени от клавиатурата. Да се направи проверка за грешка при отварянето.

Задача 2. Да се напише програма, която записва числата от 1 до 100 в последователен файл.

Задача 3. Да се напише програма, която създава файла от Зад.1 , чете го и го извежда на екрана.

Задача 4. Да се напише програма, която добавя данни в края на съществуващ файл.

 

 

 

à      Ç     œ