Навигация
Главная
Поиск
Форум
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
Invision Power ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Организация зап... 64631
Создание потоко... 61912
Модуль Forms 61238
Создание отчето... 61184
ТЕХНОЛОГИИ ДОСТ... 57645
Пример работы с... 55146
Имитационное мо... 53036
Реклама
Сейчас на сайте
Гостей: 5
На сайте нет зарегистрированных пользователей

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

Калькулятор на Delphi с переводом в другую систему исчисления + Блок схемы
Лабораторная работа по динамическим спискам на Turbo Pascal (удаление ду...
Моделирование процесса обработки заданий пакетным режимом работы с квант...

Реклама



Подписывайся на 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 02:31:28 · 0 Комментариев · 2988 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
PHP глазами хакера
Delphi. Готовые а...
Работа с базами д...
Ведение справочны...
Socoban
Современное проек...
Visual Studio 200...
SysInfo [Исходник...
Dbgridpack
Интерактивный инт...
Модифицированная ...
С# для профессион...
Text effect
DateEdit
Технология .Net в VB
VFW
Delphi 7 Enterpri...
Error mod
Handles
Популярные загрузки

Топ загрузок
Приложение Клие... 100384
Delphi 7 Enterp... 83543
Converter AMR<-... 20051
GPSS World Stud... 11304
Borland C++Buil... 11234
Borland Delphi ... 8177
Turbo Pascal fo... 6987
Visual Studio 2... 4970
Калькулятор [Ис... 4418
FreeSMS v1.3.1 3516
Случайные статьи
Играть в Кекс на с...
Cannot Read or Wri...
Язык верификации
Инструктирование
Настройки чтения
Проблемы быстродей...
Монтаж вывески
Добавление в проек...
Base) 326Microsoft...
Инвариант на второ...
Line too long
Поиск и замена текста
Создание пакетов и...
Язык XSL как спосо...
Интернет-магазин ...
Организация информ...
Оглавление
Решение логических...
Какова настройка м...
2. RADIUS-прокси т...
Создание компонент...
Адресация по базе ...
Стационарные решения
Контроль перегрузки
5.1. Тестовая прог...
Статистика



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


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