Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Прямой доступ при работе с файлами
Во всех предыдущих примерах чтение и запись данных в файлы осуществлялась последовательно. Однако существуют методы, обеспечивающие возможность произвольного доступа к любому байту файла для осуществления записи или чтения данных именно в эту точку файла. Поддержка этих методов основана на понятии указателя позиции в файле (или просто – указателя). В языке C++ поддерживается работа с двумя указателями. Один указатель (get -указатель) определяет место в файле, откуда должны быть прочитаны данные. Другой – put -указатель определяет место для записи данных. При выполнении операций чтения-записи соответствующие указатели автоматически перемещаются в файле на расстояние, равное объему прочитанных или записанных данных, тем самым подготавливая следующую операцию чтения или записи. Замечание. Рассматриваемые далее методы ориентированы на использование в двоичном режиме работы с файлами. В текстовом режиме позиционирование указателей может оказаться не точным. Перемещение указателей в потоках осуществляется с помощью соответствующих потоковых функций: · ifstream &seekg (off_type offset, seekdir way); - перемещение get -указателя; · ofstream &seekp (off_type offset, seekdir way); - перемещение put -указателя. Перемещение соответствующего указателя осуществляется на offset байт (тип данных off_ type – целочисленный тип данных, может принимать отрицательные и положительные значения) относительно точки, задаваемой параметром way. Тип данных seekdir параметра way имеет три возможных значения: · ios:: beg – начало файла; · ios:: cur – текущая позиция; · ios:: end – конец файла. Существуют перегруженные функции позиционирования указателей, обеспечивающие абсолютную адресацию указателя в заданную позицию файла: · ifstream & seekg (pos_ type pos); - перемещение get -указателя в позицию pos; · ofstream & seekp (pos_ type pos); - перемещение put -указателя в позицию pos. Тип данных pos_ type является целочисленным беззнаковым типом. Позиция 0 соответствует началу файла. Определить текущие позиции указателей можно с помощью следующих потоковых функций: pos_ type tellg (); - возвращает текущую позицию get -указателя; pos_ type tellp (); - возвращает текущую позицию put -указателя; В качестве иллюстрации напишем функцию, возвращающую размер в байтах заданного файла:
unsigned FileSize (char *FileName) { ifstream File (FileName, ios::in | ios::binary); if (! File) // Проверили удалось ли открыть файл { cout << "Файл не найден! \ n"; return 0; } File.seekg (0, ios::end); unsigned Size = File.tellg(); File.close (); return Size; } Статус потоков ввода-вывода Потоки ввода-вывода после выполнения каждой операции ввода-вывода находятся в определенном состоянии, характеризующимся, так называемым, статусом потока. Статус потока ввода-вывода представляет собой перечисление, имеющее следующие значения: · ios:: goodbit – нормальное состояние потока – ошибки отсутствуют; · ios:: eofbit – достигнут конец файла; · ios:: failbit – исправимая ошибка; · ios:: bedbit – неисправимая ошибка. Значение статуса после завершения очередной операции ввода-вывода можно узнать с помощью функции rdstate (), которая возвращает значение одного из перечисленных выше значений:
fstream File (……..); while (File.rdstate () = ios:: goodbit) { // Выполняем очередную операцию с файлом }
Еще один способ узнать значение статуса потока ввода-вывода состоит в использовании одной из следующих функций потока, возвращающих значение true, при установке соответствующего флага статуса: · bool good () · bool eof () – эту функцию мы уже использовали раньше · bool fail () · bool bed ()
Например:
fstream File (……..); While (File.good ()) { // Выполняем очередную операцию с файлом }
Если после выполнения очередной операции ввода-вывода установлен статус потока отличающийся от ios:: goodbit, дальнейшее выполнение операций по работе с потоком может стать невозможным. Для попытки продолжения работы с потоком в этом случае следует воспользоваться потоковой функцией clear (). Эта функция очищает статус потока ввода-вывода и устанавливает флаг статуса ios:: goodbit.
|
|||||
Последнее изменение этой страницы: 2021-09-26; просмотров: 191; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.174.195 (0.008 с.) |