АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Указатели файлов (текущая позиция). Функции для работы с указателями файлов

Читайте также:
  1. I. КУРСОВЫЕ РАБОТЫ
  2. I. ОБЩИЕ УКАЗАНИЯ К ВЫПОЛНЕНИЮ КУРСОВОЙ РАБОТЫ
  3. II. ДИПЛОМНЫЕ РАБОТЫ
  4. II. МЕТОДИЧЕСКИЕ УКАЗАНИЯ ДЛЯ ВЫПОЛНЕНИЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
  5. II. Основные задачи и функции
  6. II. ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ КУРСОВОЙ РАБОТЫ
  7. III. Задания для самостоятельной работы по изучаемой теме.
  8. III. Задания для самостоятельной работы по изучаемой теме.
  9. III. Задания для самостоятельной работы по изучаемой теме.
  10. III. Задания для самостоятельной работы по изучаемой теме.
  11. III. Задания для самостоятельной работы по изучаемой теме.
  12. III. Задания для самостоятельной работы по изучаемой теме.

Указатели файлов

У каждого файлового объекта есть два ассоциированных с ним значения, назы-
ваемые указатель чтения и указатель записи. Их также называют текущая по-
зиция чтения и текущая позиция записи. Или, если так лучше для восприятия,
просто текущая позиция. Эти значения определяют номер байта относительно
начала файла, с которого будет производиться чтение или запись. (Слово «ука-
затель» в этом контексте не следует путать с обычными указателями C++, ис-
пользуемыми в качестве адресных переменных.)

Часто требуется начинать чтение файла с начала и продолжать до конца.
Во время записи бывает нужно начинать с начала, удаляя существующую ин-
формацию, или с конца, для чего файл следует открывать с флагом ios::app.
Это действия, которые выполняются по умолчанию, и никаких дополнительных
манипуляций с указателями файлов проводить не требуется. Но бывает нужно
контролировать указатели вручную, чтобы иметь возможность читать и писать,
начиная с произвольного места файла. Функции seekg() и tellg() позволяют уста-
навливать и проверять текущий указатель чтения, а функции seekp() и tellp()—
выполнять те же действия для указателя записи.

Вычисление позиции

Мы уже видели пример позиционирования указателя чтения в программе DISKFUN,
где функция seekg() устанавливала его на начало файла с тем, чтобы чтение на-
чиналось оттуда. Этот вариант seekg() имеет один аргумент, представляющий со-
бой абсолютную позицию относительно начала файла. Начало принимается за 0,
что и использовалось в DISKFUN. Это условно показано на рис. 12.4

Рис. 12.4. Функция seekg() с одним аргументом

Вычисление сдвига

Функция seekg() может использоваться в двух вариантах. Первый из них мы уже
видели — используется аргумент для указания позиции относительно начала
файла. Но можно использовать эту функцию и с двумя аргументами, первый из
которых — сдвиг относительно определенной позиции в файле, а второй опреде-
ляет позицию, начиная с которой отсчитывается этот сдвиг. Второй аргумент мо-
жет иметь три значения: beg означает начало файла, cur — текущую позицию ука-
зателя файла, end — это конец файла. Например, выражение

seekp(-10. ios::end);

установит указатель записи за 10 байтов до конца файла. То, как это выглядит,
условно изображено на рис. 12.5

 

Рис. 12.5. Функция seekp() с двумя аргументами

Вот пример, в котором используется двухаргументный вариант seekg() для
нахождения конкретного объекта (человека) класса person в файле GROUP.DAT
и для вывода данных об этом человеке.

Листинг 12.13. Программа SEEKG

// seekg.cpp

// Поиск конкретного объекта в файле

#include <fstream> // для файловых потоков

#include <iostream>

using namespace std;

///////////////////////////////////////////////////////////

class person // класс person

{ protected:

char name[80]; // имя человека

int age; // его возраст

public:

void getData() // получить данные о человеке

{

cout << "\n Введите имя: "; cin >> name;

cout << " Введите возраст: "; cin >> age;

}

void showData(void) // вывод данных о человеке

{

cout << "\n Имя: " << name;

cout << "\n Возраст: " << age;

}

};

///////////////////////////////////////////////////////////

int main()

{

person pers; // создать объект person

ifstream infile; // создать входной файл

infile.open("GROUP.DAT",ios::in|ios::binary); // открыть

// файл

infile.seekg(0, ios::end); // установить указатель на 0

// байт от конца файла

int endposition = infile.tellg(); // найти позицию

int n = endposition / sizeof(person); // число человек

cout << "\nВ файле " << n << " человек(а)";

 

cout << "\nВведите номер персоны: ";

cin >> n;

int position = (n-1) * sizeof(person); // умножить размер

// данных под персону на число персон

infile.seekg(position); // число байт от начала

// прочитать одну персону

infile.read(reinterpret_cast<char*>(&pers), sizeof(pers));

pers.showData(); //вывести одну персону

cout << endl;

return 0;

}

 

Результат работы программы (при предположении, что файл GROUP.DAT —
тот же, что в DISKFUN):

В файле 3 человек(а)
Введите номер персоны: 2

Имя: Артур
Возраст: 60

Для удобства работы пользователя мы нумеруем объекты (персоны), начиная
с единицы, хотя в программе нумерация ведется с нуля. Поэтому персона №2 —
это второй из трех человек, записи о которых имеются в файле.

Функция tellg()

Первое, что делает программа, это вычисляет количество человек в файле. Она
делает это установкой указателя чтения на конец файла с помощью выражения


infile.seekg(0, ios::end);

 

Функция tellg() возвращает текущую позицию указателя чтения. Программа
использует ее для вычисления длины файла в байтах. Так как длина одной за-
писи известна, то, исходя из общей длины файла, можно узнать, сколько всего
объектов хранится в файле. Результат выводится на экран.

В приведенном выше примере работы программы пользователь выбрал вто-
рой объект из файла. Программа считает с помощью seekg(), сколько нужно
отступить от начала файла для того, чтобы попасть на начало области данных
выбранного объекта. Затем она использует функцию read() для чтения данных,
начиная с этого места. Наконец, функция showData() выводит информацию на
экран.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |

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



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.)