Рассмотрим, как применять средства форматирования для создания форматированного отчета о наличии товаров. Допустим, у нас есть подготовленный в текстовом редакторе файл с перечнем товаров, в котором одна запись занимает 2 строки: на первой строке - название товара, на второй — количество и цена.
Пусть файл с именем tovar.dat записан на дискете. Требуется записать новый файл-ведомость, который потом можно будет выводить на принтер. В одной строке файла 5 полей:
1. Номер по порядку, ширина поля — 3 символа.
2. Название товара — 40 символов.
3. Цена — 7 символов, два знака после запятой.
4. Количество — 6 символов, целое число.
5. Стоимбсть = количество цена — 12 символов, 2 знака после запятой.
Поля разделяются символом | (вертикальная черта). Название нужно выравнивать влево, а если оно занимает больше 40 символов, то его надо обрезать. Числа нужно выравнивать вправо, причем числа, обозначающие деньги, выводить с фиксированной точкой и двумя знаками после запятой. Десятичная система установлена по умолчанию, а ширину поля приходится задавать для каждого поля (для каждой операции вывода) заново. После всех записей нужно вывести итоговую сумму. Записывать файл будем тоже на дискету (листинг 14.15).
Листинг 14.15. Форматирование ведомости
#include <fstream> #include <iomanip> #include <string> using namespace std; int main() { struct Tovar
{ string name: // наименование товара
unsigned int HowMany; // копичество
double Price; // цена
};
Tovar tmp;
ifstream inf("a:/tovar.dat"); // исходный файл
ofstream to ("a:/summa.dat"); // файл-ведомость
int i = 1; double Summa = 0;
// чтение первой записи
getline(inf, tmp.name);
inf >> tmp.HowMany; inf >> tmp.Price; inf.ignoreO;
while(!inf.eof()) // пока не конец файла
{ to << right << setw(3) << i++ << '|':
to << left << setw(40) << tmp.name.substr(0,40) << ' |':
to.precision(2);
to << right << fixed
<< setw(6) << tmp.HowMany << '|' << setw(7) << tmp.Price << 1 | ' << setw(12) << tmp.Price*tmp.HowMany << '|' << endl; getline(inf, tmp.name);
inf >> tmp.HowMany; inf >> tmp.Price; inf.ignoreO;
to << setw(72) << Summa << endl; return EXIT SUCCESS;
После чтения чисел потребовалось вставить вызов ignore() для пропуска символа конца строки, иначе ввод работал бы неправильно. Максимально используются манипуляторы, что делает программу существенно понятнее.
Пусть исходный файл tovar.dat содержит следующие данные:
Авторучки перьевые 1031 257.50 Авторучки шариковые 2143 6.50
Пампы настольные люминесцентные белые 300 350
Папки для бумаг 10677 12.67
Тогда результирующий файл summa.dat будет выглядеть так:
1|Авторучки перьевые |
2|Авторучки шариковые |
3|Лампы настольные люминесцентные белые |
4|Папки для бумаг |
Найти хороший шаблон для своего сайта вы всегда можете тут http://test-templates.com/.
1031| 2143| 300| 10677|
257.50| 6.50| 350.00| 12.67|
265482.50| 13929.50| 105000.001 135277.59| 519689.59
|