ТОП 10:

Управление выводом. Манипуляторы и флажки.



Функции управления выводом позволяют определять, когда вывод будет отправлен из скрипта. Это можно использовать в различных ситуациях, особенно если вам нужно выслать шапки/headers браузеру, после того как ваш скрипт начал выводить данные. Функции управления выводом не влияют на шапки, высылаемые функциями header() или setcookie(), только на такие функции, как echo(), и на данные между блоками PHP-кода.Пример 1. Управление выводом<?php

В приведённом примере вывод из echo() будет сохранён в буфере вывода, пока ob_end_flush() не будет вызвана. Тем временем вызов setcookie() успешно сохранил cookie без возникновения ошибки. (Вы не можете нормально отправить шапки/headers браузеру, после того как данные уже были отправлены.)

Содержание

flush - очищает буфер вывода; ob_clean - очищает (удаляет) буфер вывода; ob_end_clean - очищает (удаляет) буфер вывода и выключает буферизацию вывода; ob_end_flush - очищает (отправляет) буфер вывода и включает буферизацию вывода; ob_flush - очищает (отправляет) буфер вывода

ob_get_contents - возвращает содержимое буфера вывода

ob_get_length - возвращает длину буфера вывода; ob_get_level - возвращает содержащий/nesting уровень механизма буферизации вывода; ob_gzhandler - ob_start callback-функцию для буфера вывода gzip

ob_implicit_flush - включает/выключает неявную очистку; ob_start - включает буферизацию вывода

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

endl-перевод строки; flush-выгружает содержимое буфера в поток; dec-меняет формат вывода числа на десятичный; oct-меняет формат вывода числа на восьмеричный; hex-меняет формат вывода числа на шестнадцатеричный; ws-извлекает и удаляет символы пустых промежутков из потока; showpos-показывает + перед неотрицательными числами; showpoint-показывает десятичную точку; noshowpoint-скрывает десятичную точку

Флаги представляют собой отдельные биты, объединенные в поле x_flags типа long класса ios.Примеры:

skipws –при извлечениипробельные символы игнорируються, left – выравнивание по левому краю, dec- десятичная система счисления, oct- восмиричная система счисления, fixed- печатать вещественные числа с фиксированной точной.Для управления флагами в классе есть методы flags, setf и unsetf. Перед установкой флагов требуеться сбросить флаги, которые не могут быть установлены одновременно с ними.

 

Файловые потоки.

Потоки для работы с файлами создаются как объекты следующих классов:

ofstream - запись в файл; ifstream - чтение из файла; fstream - чтение/запись.

Для создания потоков имеются следующие конструкторы:

fstream();создает поток, не присоединяя его ни к какому файлу.

fstream(constchar *name, int mode, int p = filebuf::openprot);создает поток, присоединяет его к файлу с именем name, предварительно открыв файл, устанавливает для него режим mode и уровень защиты p. Если файл не существует, то он создается. Для mode = ios::out, если файл существует, то его размер будет усечен до нуля. Флаги режима определены в классе ios и имеют следующие значения:

in - для чтения out - для записи

Если при создании потока он не присоединен к файлу, то присоединить существующий поток к файлу можно функцией void open(const char *name, int mode, int p = filebuf::openprot);

Функция void fstream base::close(); сбрасывает буфер потока, отсоединяет поток от файла и закрывает файл. Эту функцию необходимо явно вызвать при изменении режима работы с потоком. Автоматически она вызывается только при завершении программы.

Таким образом, создать поток и связать его с файлом можно тремя способами:

1. Создается объект filebuf filebuf fbuf;

Объект filebuf связывается с устройством (файлом) fbuf.open("имя", ios::in);

Создается поток и связывается с filebuf istream stream(&fbuf);

2. Создается объект fstream (ifstream, ofstream) fstream stream;

Открывается файл, который связывается через filebuf с потоком stream.open("имя", ios::in);

3. Создается объект fstream, одновременно открывается файл, который связывается с потоком fstream stream("имя", ios::in).

ОПРЕДЕЛЕНИЕ КОНЦА ФАЙЛА

Обычной файловой операцией в программах является чтение содержимого файла, пока не встретится конец файла. Чтобы определить конец файла, ваши программы могут использовать функцию еоf потокового объекта. Эта функция возвращает значение 0, если конец файла еще не встретился, и 1, если встретился конец файла. Используя цикл while, программы могут непрерывно читать содержимое файла, пока не найдут конец файла, как показано ниже:

while (! input_file.eof()){// Операторы}

ПРОВЕРКА ОШИБОК ПРИ ВЫПОЛНЕНИИ ФАЙЛОВЫХ ОПЕРАЦИЙ

Если ваша программа пишет данные в файл, вам необходимо убедиться, что операция прошла успешно (к примеру, отсутствие места на диске, скорее всего, помешает записи данных). Чтобы помочь программам следить за ошибками, вы можете использовать функцию fail файлового объекта. Если в процессе файловой операции ошибок не было, функция возвратит ложь (0). Однако, если встретилась ошибка, функция fail возвратит истину. Например, если программа открывает файл, ей следует использовать функцию fail, чтобы определить, произошла ли ошибка, как это показано ниже:

ЗАКРЫТИЕ ФАЙЛА, ЕСЛИ ОН БОЛЬШЕ НЕ НУЖЕН

При завершении программы операционная система закроет открытые ею файлы. Однако, как правило, если программе файл больше не нужен, она должна его закрыть. Для закрытия файла программа должна использовать функцию close:

input_file.close ().

 

Шаблоны функций

Шабло́ны (англ. template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).

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

Хотя шаблоны предоставляют краткую форму записи участка кода, на самом деле их использование не сокращает исполнимый код, так как для каждого набора параметров компилятор создаёт отдельный экземпляр функции или класса.

Шаблон функции начинается с ключевого слова template, за которым в угловых скобках следует список параметров. Затем следует объявление функции:

template< typename T >

void sort( T array[], int size ); // прототип: шаблон sort объявлен, но не определён

template< typename T >

void sort( T array[], int size ) // объявление и определение

{

T t;

for (int i = size - 1; i > 0; i--)

for (int j = i; j > 0; j--)

if (array[j] < array[j-1])

{

t = array[j];

array[j] = array[j-1];

array[j-1] = t;

}}

template< int BufferSize > // целочисленный параметр

char* read()

{ char *Buffer = new char[ BufferSize ];

/* считывание данных */

return Buffer;}

 

Шаблоны классов.

Шабло́ны (англ. template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).

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

В классе, реализующем связный список целых чисел, алгоритмы добавления нового элемента списка, поиска нужного элемента не зависят от того, что элементы списка — целые числа. Те же алгоритмы применялись бы и для списка символов, строк, дат, классов игроков, и так далее.

template< class T >

class List

{

public:

void Add( const T& Element );

bool Find( const T& Element );

};

[править]

Использование шаблонов

Для использования шаблона класса, необходимо указать его параметры. В качестве параметров могут использоваться типы, шаблоны и переменные. Типы могут быть как стандартными так и определёнными пользователем.

 

Указатель типа «void».

В C++ существует специальный тип указателя, который называется указателем на неопределённый тип. Для определения такого указателя вместо имени типа используется ключевое слово void в сочетании с описателем, перед которым располагается символ ptrОперации *.

void *UndefPoint;

С одной стороны, объявленная подобным образом переменная также является объектом определённого типа - типа указатель на объект неопределённого типа. Но, с другой стороны, для объекта типа указатель на объект неопределённого типа отсутствует информация о размерах и внутренней структуре адресуемого участка памяти. Из-за этого не могут быть определены какие-либо операции для преобразования значений.

Поэтому переменной UndefPoint невозможно присвоить никаких значений без явного преобразования этих значений к определённому типу указателя.

UndefPoint = 0xb8000000; // Такое присвоение недопустимо.

Объектам типа указатель на объект неопределённого типа в качестве значений разрешается присваивать значения лишь в сочетании с операцией явного преобразования типа.

В этом случае указатель на объект неопределённого типа становится обычным указателем на объект какого-либо конкретного типа. Со всеми вытекающими отсюда последствиями. Для указателя на объект неопределённого типа не существует способа непосредственной перенастройки указателя на следующий объект с помощью операции инкрементации.

 

Операция «typeid»

Для динамической идентификации типов применяются операторы dynamic_cast и typeid (определён в файле typeinfo.h), для использования которых информацию о типах во время выполнения обычно необходимо добавить через опции компилятора при компиляции модуля.

Оператор dynamic_cast пытается выполнить приведение к указанному типу с проверкой. Целевой тип операции должен быть типом указателя, ссылки или void*.

Если целевой тип — тип указателя, то аргументом должен быть указатель на объект класса.

Если целевой тип — ссылка, то аргумент должен также быть соответствующей ссылкой.

Если целевым типом является void*, то аргумент также должен быть указателем, а результатом операции будет указатель, с помощью которого можно обратиться к любому элементу «самого производного» класса иерархии, который сам не может быть базовым ни для какого другого класса.

Оператор typeid возвращает ссылку на структуру type_info, которая содержит поля, позволяющие получить информацию о типе.







Последнее изменение этой страницы: 2016-08-26; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 54.237.183.249 (0.009 с.)