C++. Сборник рецептов
Шрифт:
Основной лейтмотив этого рецепта не отличается от лейтмотива предыдущих рецептов, связанных с обеспечением безопасности исключений. Сначала выполняйте действия, которые могут создать проблемы, предусмотрите блок
Рецепт 9.2 и рецепт 9.3.
Глава 10
Потоки и файлы
10.0. Введение
Потоки (streams) являются одной из самых мощных (и сложных) компонент стандартной библиотеки С++. Их применение при простом, неформатированном вводе-выводе в целом не представляет трудностей, однако ситуация усложняется, если необходимо изменить формат с помощью стандартных манипуляторов
Затем рецепты переходят с темы чтения и записи содержимого файлов на работу с самими файлами (и каталогами). Если в вашей программе используются файлы особенно если такая программа является демоном или процессом на стороне сервера, вам, вероятно, потребуется создавать файлы и каталоги, удалять их, переименовывать и выполнять другие операции над ними. Существует ряд рецептов, которые показывают, как следует решать эти непривлекательные, но необходимые задачи в С++.
Последняя треть рецептов показывает, как можно манипулировать именами файлов и путями доступа к ним, используя многие стандартные строковые функции-члены. Стандартные строки содержат массу функций, предназначенных для анализа и манипулирования их содержимым, и если вам придется анализировать пути доступа к файлам и имена файлов, эти функции окажутся полезными. Если в этих рецептах нет того, что вам требуется, вернитесь к главе 7: возможно, там описано то, что вы ищете.
Манипулирование файлами требует прямого взаимодействия с операционной системой (ОС), но между различными ОС часто имеются тонкие отличия (а иногда вопиющие несовместимости). Многие типичные операции над файлами и каталогами выполняются с помощью вызовов системных функций стандартной библиотеки С. которые работают одинаково или аналогично в различных системах. В рецептах я отмечаю отличия версий библиотек различных ОС там, где они имеются.
Как я отмечал в предыдущих главах, Boost — это проект открытого исходного кода, результатом которого стал ряд высококачественных и переносимых библиотек. Однако поскольку данная книга посвящена C++, а не проекту Boost, во всех возможных случаях я предпочитаю пользоваться стандартными решениями С++. Однако во многих случаях (наиболее примечательный — рецепт 10.12) нельзя получить решения, используя стандартную библиотеку С++, поэтому я пользуюсь библиотекой Boost Filesystem, написанной Биманом Дейвисом (Beman Dawes); она обеспечивает переносимый интерфейс для файловой системы, позволяя получать переносимые решения. Используйте библиотеку Boost Filesystem, если требуется обеспечить переносимость взаимодействия с файловой системой, и это позволит вам сэкономить много времени и многих усилий. Дополнительную информацию по проекту Boost вы найдете на сайте www.boost.org.
10.1. Вывод выровненного текста
Требуется вывести текст, выровненный по вертикали. Например, если ваши данные представлены в табличном виде, вам захочется, чтобы они выглядели следующим образом.
Кроме того, вам, вероятно, захочется иметь возможность выравнивать текст вправо или влево.
Используйте определенные в
Пример 10.1. Вывод выровненного текста
Вывод выглядит следующим образом.
Манипулятор — это функция, которая выполняет некоторую операцию над потоком. Применяемые к потоку манипуляторы задаются в операторе
В примере 10.1 используется два манипулятора для вывода текста в две колонки. Манипулятор
Если помещаемое в поле значение превышает его размер, будет напечатано все значение и никаких дополнительных символов выводиться не будет.
Табл. 10.1 содержит краткое описание манипуляторов, работающих с любыми типами значений (текстом, числами с плавающей точкой, целыми числами и т.д.). Имеется ряд манипуляторов, которые применяются только при выводе чисел с плавающей точкой — они описываются в рецепте 10.2.
Табл. 10.1. Текстовые манипуляторы
| Манипулятор | Описание | Пример вывода |
|---|---|---|
left right | Выровнять значения в текущем поле вправо или влево, заполняя незанятое пространство символом-заполнителем | Выравнивание влево apple banana cherry Выравнивание вправо (ширина поля 10) apple banana cherry |
setw(int n) | Установить размер поля на n символов | См. предыдущий пример |
setfill(int с) | Использовать символ с для заполнения незанятого пространства поля | cout << setfill('.') << setw(10) << right << "foo" Выдает: .......foo |
boolalpha noboolalpha | Отобразить булевы значения в текущем локализованном представлении слов true и false , а не 1 и 0 | cout << boolalpha << true Выдает: true |
endl | Записать в поток символ новой строки (newline) и очистить буфер вывода | Нет |
ends | Записать в поток null-символ ('\0') | Нет |
flush | Очистить буфер вывода | Нет |