Чтение онлайн

на главную - закладки

Жанры

Шрифт:

– необязательный знак минус, который задает выравнивание преобразованного значения влево в указанном поле;

d необязательная строка цифр, задающая ширину поля. Если преобразованное значение имеет меньше цифр, чем ширина поля, оно будет дополняться пробелами слева (или справа, если был задан индикатор выравнивания влево) до заполнния всей ширины поля; если ширина поля начинается с нля, то вместо дополнения пробелами будет делаться допонение нулями;

. необязательная точка, для отделения ширины поля от

следующей строки цифр;

d необязательная строка цифр, специфицирующая

точность, которая задает число цифр после десятичной точки для преобразований e и f или печатаемых символов для строки;

* в ширине поля или точности вместо строки цифр может стять *. В этом случае ширина поля и точность задается цлым параметром;

h необязательный символ h; указывает на то, что идущие за ним d, o, x или y соответствуют параметру короткое цлое;

l необязательный символ h; указывает на то, что идущие за ним d, o, x или y соответствуют параметру длинное целое;

% указывает, что должен быть напечатан символ %, никакие параметры при этом не затрагиваются;

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

d целый параметр преобразуется в десятичную запись;

o целый параметр преобразуется в восьмеричную запись;

x целый параметр преобразуется в шестнадцатиричную запись;

f параметр float или double преобразуется в десятичную запись вида [-]ddd.ddd, где число, задаваемое цифрами d после десятичной точки, эквивалентно спецификации тоности для параметра. Если точность опущена, дается шесть цифр; если точность явно задана как 0, то не печатается десятичная точка и не печатается ни одной цифры;

e параметр float или double преобразуется в десятичную запись вида [-]d.ddde+dd, где перед десятичной точкой стоит одна цифра, а число, задаваемое цифрами после дсятичной точки, эквивалентно спецификации точности для параметра; когда точность опущена, выдается шесть цифр;

g параметр float или double печатается в том из видов d, f или e, который обеспечивает полную точность при минмальной затрате места;

c печатается символьный параметр, пустые символы игнорруются;

s параметр воспринимается как строка (указатель на сивол), и печатаются символы из строки до пустого символа или до тех пор, пока не будет достигнуто число символов, указанное спецификацией точности; но если точность равна нулю, печатаются все символы до пустого;

u беззнаковый целый параметр преобразуется в десятичную запись.

Несуществующая или недостаточная ширина поля никогда не приводит к обрезанию поля; дополнение поля записи имеет место только в том случае, если указанная ширина поля превышает фактическую ширину.

Вот более сложный пример:

char* src_file_name;

int line; char* line_format = «\n#line %d \»%s\"\n"; //... cout «„ „int a;\n“; cout «« form(line_format,line,src_file_name); cout «« «int b;\n“;

который печатает

int a;

#line 13 «С++/main.c» int b;

Применение form небезопасно в смысле того, что не вполняется проверка типа. Вот, например, хорошо хорошо извесный способ получить непредсказуемый вывод и/или дамп (core dump):

char x; // ... cout«„form(«bad input char: %s“,x);

Правда,

она дает большую гибкость в том виде, который хорошо знаком программистам на C. Потоковый вывод можно смшивать с выводом в стиле printf.

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

class complex (* float re,im; public: // ... char* string(char* format) (* return form(format,re,im); *) *); // ... cout «„ z.string(«(%.3f,%.3f)“);

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

8.2.5 Виртуальная функция вывода

Иногда функция вывода должна быть virtual. Рассмотрим пример класса shape, который дает понятие фигуры (#1.18):

class shape (* // ... public: // ... virtual void draw(ostream amp; s); // рисует «this» на "s" *);

class circle : public shape (* int radius; public: // ... void draw(ostream amp;); *);

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

Чтобы поддерживать для таких классов стандартную пардигму вывода, операция «« определяется так:

ostream amp; operator«„(ostream amp; s, shape* p) (* p-“draw(s); return s; *)

Если next – итератор типа определенного в #7.3.3, то список фигур распечатывается например так:

while ( p = next ) cout «« p;

8.3 Файлы и потоки

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

8.3.1 Инициализация потоков вывода

ostream имеет конструкторы:

class ostream (* // ... ostream(streambuf* s); // связывает с буфером потока ostream(int fd); // связывание для файла ostream(int size, char* p); // связывает с вектором *);

Главная работа этих конструкторов – связывать с потоком буфер. streambuf – класс, управляющий буферами; он описываеся в #8.6, как и класс filebuf, управляющий streambuf для файла. Класс filebuf является производным от класса streambuf.

Поделиться:
Популярные книги

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Афганский рубеж 4

Дорин Михаил
4. Рубеж
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Афганский рубеж 4

Точка Бифуркации V

Смит Дейлор
5. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации V

Шайтан Иван 2

Тен Эдуард
2. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Шайтан Иван 2

Лондон

Резерфорд Эдвард
The Big Book
Проза:
историческая проза
6.67
рейтинг книги
Лондон

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Вечный. Книга III

Рокотов Алексей
3. Вечный
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга III

Имперец. Том 5

Романов Михаил Яковлевич
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Имперец. Том 5

Путь Хранителя. Том 1. Том 2

Саваровский Роман
1. Путь Хранителя
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Путь Хранителя. Том 1. Том 2

Апокриф

Вайс Александр
10. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Апокриф

Живое проклятье

Алмазов Игорь
3. Жизнь Лекаря с нуля
Фантастика:
попаданцы
альтернативная история
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Живое проклятье

Чужак из ниоткуда

Евтушенко Алексей Анатольевич
1. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Блуждающие огни

Панченко Андрей Алексеевич
1. Блуждающие огни
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Блуждающие огни