Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 17
На сайте нет зарегистрированных пользователей

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

Моделирование интернет магазина (Apache, Php, Html) на GPSS + Блок схема
Информационная система - транспортный парк на Turbo Pascal (База данных)...
Метод конечных разностей для интерполяции/экстраполяции на Delphi

Произвольный доступ
Как уже отмечалось, С++ позволяет выполнять позиционирование в любых потоках, кроме стандартных. Методы позиционирования приведены в табл. 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 23 2014 22:31:28 · 0 Комментариев · 4451 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Midi
Xrumer 4 Platinum...
Handles
PBEditPack
Расширенный загру...
ATComponents
Самоучитель PHP 4
Голосование для ...
Encrypt Decrypt
С. Г. Горнаков - ...
«Философия» прогр...
ИНТЕРНЕТ ПРОГРАММ...
Игра в крестики н...
Delphi World 6.0
Delphi 6 программ...
Добавление к ссы...
PHP: настольная к...
В.Понамарев - COM...
Assembler. Учебни...
XPButtons

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20261
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
1.4. Конъюнкции
Интерфейс на естес...
Формы и методы рез...
Рабочий стол, меню...
Базы данных и базы...
Поиск документов в...
Групповые адреса T...
String constant ex...
• Защита полезных ...
«Кризис — время но...
Безлимитный хостинг
Геотермальная энергия
Ordinal type expected
Если вы рассчитыва...
Сжатие данных
Создание триггера
Выбор типа XHTML-д...
Расширение сети
Описание GPSS-прог...
Настройка размера ...
Где найти нескольк...
Функции ввода для ...
Управление медиафа...
Компания Технодина...
Обработка принимае...
Статистика



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


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