Студопедия  
Главная страница | Контакты | Случайная страница

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

Произвольный доступ к элементам файлов.

Читайте также:
  1. I. Уровень доступа
  2. Ls: невозможно получить доступ к /dev/ttyACM0: Нет такого файла или каталога
  3. Ls: невозможно получить доступ к /dev/ttyACM0: Нет такого файла или каталога
  4. X. Порядок обеспечения доступа к информации о деятельности Правительства
  5. А чтобы это всё действовало, человек должен всё это знать и понимать. Тот, кто не знает и не понимает, ему информация не доступна.
  6. А чтобы это всё действовало, человек должен всё это знать и понимать. Тот, кто не знает и не понимает, ему информация не доступна.
  7. Анализ источников опасных сигналов и определение потенциальных технических каналов утечки информации и несанкционированного доступа.
  8. Анализ рынка услуг предоставления доступа к сети Интернет на территории Магаданской области по итогам 2009г. и 1 п/г 2010г.
  9. Атрибуты файлов. Дерево каталогов. Простое, полное и относительное имя файла.
  10. Блага, имеющиеся в изобилии и доступные всем в любом количестве, называются в экономической теории

Файловый указатель.

Каждый файл имеет два связанных с ним значения: указатель чтения и указатель записи, по-другому называемые файловым указателем или текущей позицией.

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

- seekg() – установить текущий указатель чтения;

- tellg() – проверить текущий указатель чтения;

- seekp() – установить текущий указатель записи;

- tellp() – проверить текущий указатель записи.

 

Организация доступа к элементам двоичных файлов.

Благодаря наличию файлового указателя, в двоичных файлах допустим произвольный доступ к их элементам, который можно реализовать с помощью перегруженных функций – элементов, унаследованных из класса istream:

istream &seekg(streampos) или

istream &seekg(streamoff, ios::seek_dir);

Типы данных streampos и streamoff эквивалентны значениям типа long, но использовать long в явном виде не рекомендуется из-за неоднозначности работы различных компиляторов. Поэтому их определяют как

typedef long sttrempos;

typedef long sttremoff;

Первая из перегруженных форм функции seekg позиционирует входной поток на заданном байте, вторая – на смещении относительно одной из трех позиций, определенных значением константы ios::seek_dir (Табл. 14.1)

Таблица 14.1

 

Константа значение описание
beg   поиск от начала файла
cur   поиск от текущей позиции файла
end   Поиск от конца файла

 

Для позиционирования внутреннего указателя файла для выходных потоков используют перегруженные функции выходных файловых потоков, унаследованных из класса ostream:

ostream &seekp(streampos);

ostream &seekp(streamoff, ios::seek_dir);

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

#include <fstream>

#include <iostream>

using namespace std;

# include <stdlib.h>

 

class bin_stream:public fstream

{ public:

bin_stream(const char *fn): fstream(fn, ios::out | ios::in | ios::binary) {}

void doneOurDate(const void*, int, int);

bin_stream &operator<<(int d) { doneOurDate(&d, sizeof(d),0);

return *this;

}

bin_stream &operator>>(int &d) { doneOurDate(&d, sizeof(d),1);

return *this;

}

};

int main()

{ int i, d, max, i_max, sum_even = 0;

randomize();

bin_stream bin_out("Bin.dat");

if (!bin_out) { cerr << "Unable to write to Bin.dat" << endl;

exit(1);

}

for (i = 0; i < 10; i++) { d = random(100);

bin_out << d;

if (d % 2 == 0) sum_even += d;

}

bin_out.seekp(0, ios::beg);

bin_out >> max;

i_max = 0;

for (i = 1; i < 10; i++) { bin_out >> d;

if (d > max) { max = d; i_max = i; }

}

bin_out.seekp(sizeof(int) * i_max, ios::beg);

bin_out << sum_even;

bin_out.seekp(sizeof(int) * i_max, ios::beg);

bin_out << sum_even;

bin_out.seekp(0, ios::beg);

for (i = 0; i < 10; i++) { bin_out >> d;

cout <<d <<' ';

}

bin_out.close();

return 0;

}

void bin_stream:: doneOurDate(const void *Ptr, int len, int sign)

{ if (!Ptr) return;

if (len <= 0) return;

if (sign==0) write((char*)Ptr, len);

else read((char*)Ptr, len);

}

 




Дата добавления: 2014-12-18; просмотров: 69 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав