Вказівники файлів

У кожного файлового об’єкту є два асоційовані з ним значення, що називаються вказівником читання та вказівником запису. Або, якщо так легше для спрйняття, - просто поточна позиція. Ці значення визначають номер байта відносно початку файлу, з якого відбуватиметься читання або запис. (Слово «вказівник» в цьому контексті не слід плутати із звичайними вказівниками С++, що використовуються як адресні змінні).

Часто потрібно почати читання файлу спочатку і продовжити його до кінця. Під час запису буває потрібно починати спочатку, видаляючи існуючу інформацію, або з кінця, для чого файл слід відкривати з прапором 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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.