По умолчанию левое поле содержит восемь символов, а общая длина строки составляет 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.

<p>4.20. Выравнивание текста в текстовом файле</p>Проблема

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

Решение

Используйте потоки и стандартные флаги форматирования потоков 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 (который зависит от реализации). Все это хозяйство определено в .

Перейти на страницу:

Похожие книги