Программирование >>  Операторы преобразования типа 

1 ... 194 195 196 [ 197 ] 198 199 200 ... 239


Эти функции используются в основном при создании файловых потоков данных без инициализации. В следующем примере открываются все файлы, имена которых передаются в аргументах, и выводится их содержимое (аналог утилиты cat системы UNIX).

1o/catl.cpp

Заголовочные файлы для файлового ввода-вывода #include <fstream> #include <iostream> using namespace std;

/* Для всех файлов, имена которых переданы в аргументах командной строки. * - открыть, вывести содержимое и закрыть файл */

int main (int argc. char* argv[]) {

Ifstream file;

Перебор аргументов командной строки for (Int i=l: 1<argc; ++i) {

Открытие файла file.open(argv[i]);

Вывод содержимого файла в cout char с;

while (file.get(c)) { cout.put(c):

Сброс флагов eofbit и failbit. установленных

при обнаружении конца файла

file.clearC);

Закрытие файла flle.closeC);

Обратите внимание: после завершения обработки файла вызывается функция с1еаг() для сброса флагов состояния, установленных при обнаружении конца файла. Этот вызов необходим, поскольку потоковый объект используется для нескольких файлов. Функция ореп() никогда не сбрасывает флаги состояния. Следовательно, если поток данных не находится в нормальном состоянии, после его закрытия и повторного открытия вам все равно придется вызвать с1еаг(), чтобы сбросить установленные флаги. То же самое следует сделать и при открытии другого файла.



Класс

Функция

Описание

basicjstreamo

tellgO

Возвращает текущую позицию чтения

seekg(pos)

Устанавливает абсолютную позицию чтения

seekg(offset/ rpos)

Устанавливает относительную позицию чтения

basic ostream<>

tellpO

Возвращает текущую позицию записи

seekp(pos)

Устанавливает абсолютную позицию записи

seekp( offset, rpos)

Устанавливает относительную позицию записи

Позиционирование чтения и записи выполняется отдельными функциями (суффикс g означает get , а суффикс р - put ). Функции чтения определяются в классе basicjstream, а функции записи - в классе basic ostream. Тем не менее не все потоковые классы поддерживают позиционирование. Например, для потоков данных cin, cout и сегг позиционирование не определено. Операции файлового позиционирования определяются в базовых классах, потому что обычно используются ссылки на объекты типов istream и ostream.

Функции seekgO и seekp() могут вызываться для абсолютных или относительных позиций. Функции tellgO и tellp() возвращают абсолютную позицию в виде значения типа pos type. Это значение не является целым числом или индексом, задающим позицию символа, поскольку логическая позиция может отличаться от фактической. Например, в текстовых файлах MS-DOS символы новой строки хранятся в файлах в виде двух символов, хотя логически они соответствуют только одному символу. Кроме того, ситуация дополнительно усложняется при многобайтовой кодировке символов.

Разобраться в точном определении типа pos type непросто: стандартная библиотека С++ определяет глобальный класс шаблона fposo для представления позиций в файлах. На базе класса fposo определяются типы streampos (для потоков данных char) и wstreampos (для потоков даииых wchar t). Эти типы используются для определения pos type соответствующих классов трактовок (см. с. 659). Наконец, переменная типа :%ps type класса трактовок требуется для определения типа pos type соответствующих потоковых классов. Следовательно,

Вместо обработки отдельных символов также можно вывести все содержимое файла одной командой, для чего оператору << в качестве аргумента передается указатель на потоковый буфер файла:

Запись содержиного файла в cout std::cout flle.rdbufO:

Подробности приведены на с. 656.

1роизвольный доступ к файлам

в табл. 13.35 перечислены функции позиционирования в потоках данных С++. Таблица 13.35. Функции позиционирования в потоках данных



позиции в потоке данных также могут представляться типом streampos, но использовать типы long и unsigned long было бы неправильно, потому что streampos не является целочисленным типом (а точнее, перестал им бьггь). Пример:

Сохранение текущей позиции

std;:1os::pos type pos - file.tellgC);

Переход к поэиции. хранящейся в pes file.seelcg(pos);

Следующие объявления эквивалентны:

std:;ios:;pos type pos; std:;streampos pos;

В версиях с относительным позиционированием смещение задается по отношению к трем позициям, для которых определены соответствующие константы (табл. 13.36). Константы определяются в классе ios base и относятся к типу seekdir.

Таблица 13.36. Константы относительных позиций Константа Описание

beg Смещение задается относительно начала файла

cur Смещение задается относительно текущей поэиции

end Сг4ещение задается относительно конца файла

Смещение относится к типу off type, который представляет собой косвенное определение для streamoff. По аналогии с pos type тип streamoff используется для определения off type в классе трактовок (см. с. 660) и в потоковых классах. Тем не менее streamoff является целым знаковым типом, поэтому смещение в потоке данных может задаваться целым числом. Пример:

Позиционирование в начапо файла file.seelcg (0. std: :ios; :beg):

Позиционирование на 20 символов вперед file.seelcg (20. std; ;1os: ;cur);

Позиционирование на 10 символов от конца файла fUe.seekg (-10, std; ;1os: ;end):

При позиционировании необходимо всегда следить за тем, чтобы позиция оставалась внутри файла. Позиционирование перед началом или после конца файла приводит к непредсказуемым последствиям.

Ранее тип streampos использовался для определения позиций в потоках данных и определялся просто как unsigned long.



1 ... 194 195 196 [ 197 ] 198 199 200 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика