![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 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; просмотров: 208; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.126.201 (0.009 с.) |