C++. Сборник рецептов - [74]

Шрифт
Интервал

> out.close();

> if (out)

>  return(EXIT_SUCCESS);

> else

>  return(EXIT_FAILURE);

>}

Этот пример делает несколько предположений о формате входного текста, так что внимательно прочтите следующий раздел.

Обсуждение

>addMargins предполагает, что ввод выглядит примерно так.

>The data is still inconclusive. But the weakness

>in job creation and the apparent weakness in

>high-paying jobs may be opposite sides of a coin.

>Companies still seem cautious, relying on

>temporary workers and anxious about rising health

>care costs associated with full-time workers

Этот текст содержит переносы в позиции 50 символов (см. рецепт 4.16) и выровнен по левому краю (см. рецепт 4.20). >addMargins также предполагает, что требуется, чтобы вывод выглядел подобно следующему, который использует для обозначения полей вместо пробелов точки.

>.......The data is still inconclusive. But the weakness..............

>.......in job creation and the apparent weakness in..................

>.......high-paying jobs may be opposite sides of a coin..............

>.......Companies still seem cautious, relying on.....................

>.......temporary workers and anxious about rising health.............

>.......care costs associated with full-time workers..................

По умолчанию левое поле содержит восемь символов, а общая длина строки составляет 72 символа. Конечно, если известно, что входной текст будет всегда выровнен по левому или правому краю, то можно просто дополнить оба конца каждой строки таким количеством символов, которое требуется. В любом случае логика очень проста. Многие методики, используемые в этом рецепте, уже описывались (потоки, дополнение >string), так что я не буду здесь на них останавливаться. Единственная новая функция здесь — это >getline.

Если требуется прочитать сразу целую строку текста или, более точно, прочитать текст до определенного разделителя, используйте шаблон функции >getline, определенный в >, как это сделано в примере 4.28.

>getline(in, tmp, '\n');

>getline читает символы из входного потока и добавляет их в >tmp до тех пор, пока не встретится разделитель >'\n', который в >tmp не добавляется. >basic_istream содержит метод с таким же именем, но с другим поведением. Он сохраняет свой вывод в символьном буфере, а не в >string. В данном случае я решил использовать преимущества метода из >string, так как мне не хотелось читать строку в символьный буфер, а затем копировать ее в >string. Таким образом, я использовал >getline в версии >string.

Смотри также

Рецепты 4.16 и 4.20.

4.20. Выравнивание текста в текстовом файле

Проблема

Требуется выровнять текст по правому или левому краю.

Решение

Используйте потоки и стандартные флаги форматирования потоков >right и >left, являющиеся частью >ios_base, определенного в >. Пример 4.29 показывает, как они работают.

Пример 4.29. Выравнивание текста

>#include

>#include

>#include

>#include


>using namespace std;


>int main(int argc, char** argv) {

> if (argc < 3)

>  return(EXIT_FAILURE);

> ifstream in(argv[1]);

> ofstream out(argv[2]);

> int w = 72;

> if (argc == 4)

>  w = atoi(argv[3]);

> string tmp;

> out.setf(ios_base::right); // Указать потоку на

>                            // выравнивание по правому краю

> while (!in.eof()) {

>  out.width(w);           // Сбросить ширину после

>  getline(in, tmp, "\n"); // каждой записи

>  out << tmp << '\n';

> }

> out.close();

>}

Этот пример принимает три аргумента: входной файл, выходной файл и ширину выровненного по правому краю текста. Входной файл может иметь следующий вид.

>With automatic download of Microsoft's (Nasdaq:

>MSFT) enormous SP2 security patch to the Windows

>XP operating system set to begin the industry

>still waits to understand its ramifications. Home

>users that have their preferences set to receive

>operating system updates as they are made

>available by Microsoft may be surprised to learn

>that some of the software they already run on

>their systems could be disabled by SP2 or may run

>very differently.

Вывод будет иметь следующий вид.

>   With automatic download of Microsoft's (Nasdaq:

>  MSFT) enormous SP2 security patch to the Windows

>     XP operating system set to begin the industry

> still waits to understand its ramifications. Home

>  users that have their preferences set to receive

>         operating system updates as they are made

>  available by Microsoft may be surprised to learn

>     that some of the software they already run on

> their systems could be disabled by SP2 or may run

>                                 very differently.

Второй пример текста выровнен по правому краю и имеет в ширину 50 символов.

Обсуждение

Шаблон класса >ios_base содержит большое количество флагов форматирования числовых и текстовых данных, читаемых из потоков или записываемых в них. Два флага, управляющих выравниванием текста, — это >right и >left. Они являются >static const-членами >ios_base и имеют тип >fmtflags (который зависит от реализации). Все это хозяйство определено в >.

Чтобы установить флаги форматирования, используйте >ios_base::setf. Она объединяет переданные в нее и уже установленные ранее флаги потока с помощью операции OR (ИЛИ). Например, эта строка включает выравнивание по правому краю:


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.