Вказівники файлів
У кожного файлового об’єкту є два асоційовані з ним значення, що називаються вказівником читання та вказівником запису. Або, якщо так легше для спрйняття, - просто поточна позиція. Ці значення визначають номер байта відносно початку файлу, з якого відбуватиметься читання або запис. (Слово «вказівник» в цьому контексті не слід плутати із звичайними вказівниками С++, що використовуються як адресні змінні).
Часто потрібно почати читання файлу спочатку і продовжити його до кінця. Під час запису буває потрібно починати спочатку, видаляючи існуючу інформацію, або з кінця, для чого файл слід відкривати з прапором ios::app. Це дії, які виконуються за замовчуванням, і ніяких додаткових маніпуляцій з вказівниками файлу робити не потрібно. Але часом потрібно контролювати вказівники вручну, щоб мати можливість читати і писати, починаючи з довільного місця файлу. Функції seekg() та tellg() дозволяють встановити і перевірити поточний вказівник читання, а функції seekp() та tellp() – виконати ті ж дії для вказівника запису.
Функція seekg() може використовуватися у двох варіантах. При першому з них використовується аргумент для вказування позиції відносно початку файлу. Але можна використовувати цю функцію і з двома аргументами, перший з яких – зсув відносно визначеної позиції в файлі, а другий визначає позицію, починаючи з якої відраховується цей зсув. Другий аргумент може мати три значення:
§ beg – початок файлу
§ cur – поточна позиція вказівника
§ end – кінець файлу
От приклад, в якому використовується двоаргументний варіант seekg() для знаходження конкретного об’єкту класу person в файлі group.dat і для виводу даних про цей об’єкт
#include<fstream>
#include<iostream>
#include<conio>
using namespace std;
class person
{ protected:
char name[80];
int age;
public:
void getData()
{cout<<"\nVvedit ima: ";cin>>name;
cout<<"Vvedit vik: ";cin>>age;
}
void showData()
{cout<<"\n Ima="<<name;
cout<<"\n Vik="<<age;
}
};
//////////////////////
int main()
{
person pers;
ifstream infile;
infile.open("group.dat",ios::in|ios::binary);
infile.seekg(0,ios::end);
int endposition=infile.tellg();
int n=endposition/sizeof(person);
cout<<"\nV faili "<<n<<" 4olovik ";
cout<<"\nVvedit N persony: ";
cin>>n;
int position=(n-1)*sizeof(person);
infile.seekg(position);
infile.read(reinterpret_cast<char*>(&pers),sizeof(pers));
pers.showData();
cout<<endl;
getch();
return 0;
}
Програма 26.9
Для зручності роботи користувача ми нумеруємо об’єкти, починаючи з одиниці, хоча в програмі нумерація ведеться з нуля.
Функція tellg()
Перше, що робить програма – це обчислення кількості чоловік у файлі. Вона здійснює це встановленням вказівника читання на кінець файлу за допомогою виразу:
infile.seekg(0,ios::end);
Функція tellg() повертає поточну позицію вказівника читання. Програма використовує її для обчислення довжини файла в байтах. Оскільки довжина одного запису відома, то, виходячи із загальної довжини файлу, можна дізнатися, скільки всього об’єктів зберігається в файлі. Результат виводиться на екран.
Дата добавления: 2015-08-26; просмотров: 673;