упражнение
№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.
Да се напише
програма,
която добавя
данни в края
на
съществуващ
файл.