Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Invision Power ... 63892
Программируемая... 63815
Организация зап... 63446
Модуль Forms 60323
Создание отчето... 60296
ТЕХНОЛОГИИ ДОСТ... 56598
Пример работы с... 53707
Имитационное мо... 52001
Создание потоко... 51622
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

Пользователей: 13,061
новичок: FooBar
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование процесса обеспечивающего надежность функционирования АСУ Т...
База данных студентов на Delphi (файл записей) + Блок схемы
Моделирование ЭВМ на GPSS (три класса заданий) + Пояснительная записка

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Произвольный доступ
Как уже отмечалось, С++ позволяет выполнять позиционирование в любых потоках, кроме стандартных. Методы позиционирования приведены в табл. 14.5. Методы позиционирования различаются для входных и выходных потоков: для входных потоков (см. п. п. 27.6.1.3 в [1]) имена методов заканчиваются символом «g» (от слова get), для выходных (см. п. п. 27.6.2.4 в [1]) — символом «р» (от слова put).
Таблица 14.5. Методы позиционирования
Метод Описание

postype tellg()
istream& seekg (postype p)
istream& seekg (off_type p, ios::seekdir s)
postype tellp()

istream& seekp (postype p)
istream& seekp (offtype p, ios::seekdir s)
Получить текущую (абсолютную) позицию чтения
Установить абсолютную позицию чтения
Установить относительную позицию чтения
Получить текущую (абсолютную) позицию записи
Установить абсолютную позицию записи Установить относительную позицию записи





Функции tellp()Htellg() возвращают абсолютное смещение от начала потока. Символы потока нумеруются, как и индексы массива, начиная с нуля. Однако тип pos_type не является целым типом. Поэтому получать текущую позицию чтения в файловом потоке нужно так:
ios::pos_type р = file.tellgO;



Можно сохранить текущую позицию и в переменной типа streampos, например:
streampos pos = f ile. tellpO ;



Переход к позиции, сохраненной в переменной pos, делается так: file.seekp(pos);
Несмотря на то что тип значения позиции в потоке не является целым значением, целые константы можно использовать в качестве аргумента в методах установки позиции — выполняется преобразование по умолчанию. Символы в потоке нумеруются, начиная с нулевого, поэтому позиционирование в начало потока можно выполнить, например, так:
file.seekg(0);



После этого опять можно будет прочитать первый символ потока.
Методы установки относительной позиции очень похожи на функцию f seek() из библиотеки <cstdio>. В классе ios_base определены следующие константы (см. п. п. 27.4.2.1.5 в [1]):
static const seekdir beg, // позиционирование от начала потока
сиг, // позиционирование от текущей позиции end; // позиционирование от конца потока



Первый аргумент, который обычно задается целым числом (выполняется преобразование по умолчанию), является смещением (в символах) от указанной позиции. Положительное число означает смещение вперед — ближе к концу файла, отрицательное — смещение назад, к началу файла. Например, позиционироваться в конец файла можно так:
file.seekg(0, ios::end);



При позиционировании нужно следить, чтобы позиция оставалась внутри файла. Попытка позиционироваться до начала потока или после конца приводит поток в состояние bad(). Небольшой пример1 показывает, как работает относительное позиционирование (листинг 14.22).
Листинг 14.22. Относительное позиционирование
int main()
{ fstream strm("с:/binfiles/oonumber2.bin",ios::binary|ios::in|ios::out); int a = 0;
// читаем числа из файла и выводим
strm.seekg(2*sizeof(int), ios::beg); // выставляемся от начала
strm.read((char *)&a, sizeof(int)); // читаем
cout << a << ' ' << '\n' ;
// записываем новое число на ту же позицию
а = 12021;
strm.seekp(2*sizeof(int), ios::beg); // выставляемся от начала
strm.write((char *)&а, sizeof(int)); // записываем
// возвращаемся, читаем снова и выводим
strm.seekg(2*sizeof(int), ios::beg); // выставляемся от начала
strm.read((char *)&a, sizeof(int)); // опять читаем
cout << a << ' ' << '\n'; return EXIT_SUCCESS;
}



В примере открывается существующий (см. листинг 14.7) двоичный файл в режиме чтения/записи. Оба флага (ios:: in | ios::out) задавать обязательно, иначе по умолчанию файловый поток открывается только для записи. Сначала читается третье от начала число, затем выполняется возврат в ту же позицию и записывается новое число. Результат можно наблюдать на экране.
С помощью методов позиционирования можно вычислить размер файла (листинг 14.23).
Листинг 14.23. Функция, вычисляющая длину файла
long filesize(ifstream &stream)
{ streampos curpos = stream. tellgO ; // сохраняем текущую позицию
stream.seekg(0, ios::end); // выставляемся на конец файла
streampos last = stream.tellgO; // получаем позицию = дпина
stream.seekg(curpos); // возвращаем текущую позицию,
return last;
}



Несмотря на то что используются переменные типа streampos, в результате выполняется преобразование по умолчанию в тип long. Применять эту функцию можно как с двоичными файлами, так и с текстовыми, например:
ifstream g;
g.open("с:/textfiles/result.files"); cout << filesize(g) << endl; g.closeO ;
g.open("c:/binfiles/bin2.bin", ios::binary); cout << filesize(g) << endl; g.closeO;



Сначала вычисляется длина текстового файла result.files, который образовался в каталоге textfiles в результате вызова функции includeFi 1е() (см. листинг 14.5). Затем с помощью той же функции вычисляется длина двоичного файла из листинга 14.8.
Методы позиционирования облегчают обработку двоичных файлов, записанных любыми другими средствами, например средствами языка Pascal. В С++, в отличие от языка программирования Pascal, отсутствуют типизированные файлы с записями (file of type). В языке Pascal такие файлы являются двоичными. Записи нумеруются, начиная с нуля, что обеспечивает прямой доступ к записи. Такие файлы в программе на языке Pascal по умолчанию открываются в режиме чтения/записи.
Мы вполне можем обработать такие файлы и обеспечить прямой доступ к записям по номерам средствами С++. Для этого нужно объявить в программе структуру, имеющую поля соответствующих типов, заданные в том же порядке, что в записи в программе на Pascale. Здесь нужно внимательно отнестись к проблеме выравнивания — структура в С++ должна иметь точно такой же размер, как и запись в Pascal. Далее нужно открыть файл как двоичный в режиме чтения/записи. Чтение из файла выполняется оператором
strm.read((char *)&record, sizeof(Т));



А запись выполняется оператором
strm.write((char *)&record, sizeof(Т));



Здесь sizeof (Т) — размер структуры в С++, который должен совпадать с размером записи в Pascal.
Методы относительного позиционирования позволяют реализовать прямой доступ к записям этого двоичного файла. Например, позиционирование на k-ю запись для чтения выполняется оператором
strm.seekg(k*sizeof(Т), beg);



Если необходимо сместиться вперед от текущей позиции на одну запись, можно воспользоваться любой из следующих инструкций:
// эквивалентные вызовы seekg
stream.seekg(stream.tellgO + sizeof(T)); // абсолютная позиция
stream.seekg(sizeof(Т), ios::cur); // относительная позиция



Сместиться назад на одну запись можно так:
stream.seekg(stream.tellgO - sizeof(Т)); // абсолютная позиция
stream.seekg(-sizeof(T), ios::cur); // относительная позиция


Опубликовал Kest May 24 2014 01:31:28 · 0 Комментариев · 2933 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Comdrv
Ведение справочны...
Иллюстрированный ...
Панель для реклам...
Пример работы с б...
DirHTMLReportBuil...
Медиа комбайн
Киллер окон
SysInfo [Исходник...
AID антивирус
PHP 5 в подлинник...
Основы программир...
FreeNet
EditButton
С# для профессион...
Assistant
Pass [Исходник на...
Visual Basic Script
PHP 5. Полное рук...
PHP глазами хакера

Топ загрузок
Приложение Клие... 100371
Delphi 7 Enterp... 82700
Converter AMR<-... 20046
Borland C++Buil... 11125
GPSS World Stud... 10655
Borland Delphi ... 8080
Turbo Pascal fo... 6967
Visual Studio 2... 4963
Калькулятор [Ис... 4307
FreeSMS v1.3.1 3510
Случайные статьи
Как вставить растр...
Возможности окруже...
Двухступенчатое об...
Процедуры обработк...
Занятие 4. Проекти...
Запуск программ на...
7.2. Оценка произв...
Социативный массив...
5.2.2. Ввод литер
Изображение TIFF
Сам механизм RTTI ...
20 методов сортиро...
Обзор электронной ...
Несколько примеров...
Изменение структур...
21 Д Безопасность ...
Выбор ключевых сло...
Цели и философия я...
Atari 5200 SuperSy...
Модуль List
Асинхронный режим ...
Создание записей э...
Доступ к рабочей к...
Строковые литералы...
Сохранение и загру...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?