C++. Сборник рецептов.
4.19. Добавление полей в текстовый файл.
Проблема.
Имеется текстовый файл, и в нем требуется сделать поля. Другими словами, требуется сдвинуть обе стороны каждой строки, содержащей какие-либо символы, так, чтобы длина всех строк стала одинаковой.
Решение.
Пример 4.28 показывает, как добавить в файл поля с помощью потоков, string и шаблона функции getline.
Пример 4.28. Добавление полей в текстовый файл.
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
Using namespace std;
Const static char PAD_CHAR = '.';
// addMargins принимает два потока и два числа. Потоки используются для.
// ввода и вывода. Первое из двух чисел представляет.
// ширину левого поля (т.е. число пробелов, вставляемых в.
// начале каждой строки файла). Второе число представляет.
// общую ширину строки.
Void addMargins(istream& in, ostream& out,
int left, int right) {
string tmp;
while (!in.eof()) {
getline(in, tmp, '\n'); // getline определена.
// в <string>
tmp.insert(tmp.begin(), left, PAD_CHAR);
rpad(tmp, right, PAD_CHAR); // rpad из рецепта.
// 4.2.
out << tmp << '\n';
}
}
Int main(int argc, char** argv) {
if (argc < 3).
return(EXIT_FAILURE);
ifstream in(argv[1]);
ofstream out(argv[2]);
if (!in || !out).
return(EXIT_FAILURE);
int left = 8;
int right = 72;
if (argc == 5) {
left = atoi(argv[3]);
right = atoi(argv[4]);
}
addMargins(in, out, left, right);
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, определенный в <string>, как это сделано в примере 4.28.
Getline(in, tmp, '\n');
Getline читает символы из входного потока и добавляет их в tmp до тех пор, пока не встретится разделитель '\n', который в tmp не добавляется. basic_istream содержит метод с таким же именем, но с другим поведением. Он сохраняет свой вывод в символьном буфере, а не в string. В данном случае я решил использовать преимущества метода из string, так как мне не хотелось читать строку в символьный буфер, а затем копировать ее в string. Таким образом, я использовал getline в версии string.
Смотри также.
Рецепты 4.16 и 4.20.
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.