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
|
// ----------------------------------------------------------------------------
// sample_advanced.cc : examples of adanced usage of format
// ----------------------------------------------------------------------------
// Copyright Samuel Krempp 2003. Use, modification, and distribution are
// subject to the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org/libs/format for library home page
// ----------------------------------------------------------------------------
#include <iostream>
#include <iomanip>
#include "boost/format.hpp"
namespace MyNS_ForOutput {
using std::cout; using std::cerr;
using std::string;
using std::endl; using std::flush;
using boost::format;
using boost::io::group;
}
namespace MyNS_Manips {
using std::setfill;
using std::setw;
using std::hex ;
using std::dec ;
using std::showbase ;
using std::left ;
using std::right ;
using std::internal ;
}
int main(){
using namespace MyNS_ForOutput;
using namespace MyNS_Manips;
std::string s;
//------------------------------------------------------------------------
// storing the parsed format-string in a 'formatter' :
// format objects are regular objects that can be copied, assigned,
// fed arguments, dumped to a stream, re-fed arguments, etc...
// So users can use them the way they like.
format fmter("%1% %2% %3% %1% \n");
fmter % 10 % 20 % 30;
cout << fmter;
// prints "10 20 30 10 \n"
// note that once the fmter got all its arguments,
// the formatted string stays available (until next call to '%')
// The result is available via function str() or stream's << :
cout << fmter;
// prints the same string again.
// once you call operator% again, arguments are cleared inside the object
// and it is an error to ask for the conversion string before feeding all arguments :
fmter % 1001;
try { cout << fmter; }
catch (boost::io::too_few_args& exc) {
cout << exc.what() << "***Dont worry, that was planned\n";
}
// we just need to feed the last two arguments, and it will be ready for output again :
cout << fmter % 1002 % 1003;
// prints "1001 1002 1003 1001 \n"
cout << fmter % 10 % 1 % 2;
// prints "10 1 2 10 \n"
//---------------------------------------------------------------
// using format objects
// modify the formatting options for a given directive :
fmter = format("%1% %2% %3% %2% %1% \n");
fmter.modify_item(4, group(setfill('_'), hex, showbase, setw(5)) );
cout << fmter % 1 % 2 % 3;
// prints "1 2 3 __0x2 1 \n"
// bind one of the argumets :
fmter.bind_arg(1, 18);
cout << fmter % group(hex, showbase, 20) % 30; // %2 is 20, and 20 == 0x14
// prints "18 0x14 30 _0x14 18 \n"
fmter.modify_item(4, setw(0)); // cancels previous width-5
fmter.bind_arg(1, 77); // replace 18 with 77 for first argument.
cout << fmter % 10 % 20;
// prints "77 10 20 0xa 77 \n"
try
{
cout << fmter % 6 % 7 % 8; // Aye ! too many args, because arg1 is bound already
}
catch (boost::io::too_many_args& exc)
{
cout << exc.what() << "***Dont worry, that was planned\n";
}
// clear regular arguments, but not bound arguments :
fmter.clear();
cout << fmter % 2 % 3;
// prints "77 2 3 0x2 77 \n"
// clear_binds() clears both regular AND bound arguments :
fmter.clear_binds();
cout << fmter % 1 % 2 % 3;
// prints "1 2 3 0x2 1 \n"
// setting desired exceptions :
fmter.exceptions( boost::io::all_error_bits ^( boost::io::too_many_args_bit ) );
cout << fmter % 1 % 2 % 3 % 4 % 5 % 6 ;
// -----------------------------------------------------------
// misc:
// unsupported printf directives %n and asterisk-fields are purely ignored.
// do *NOT* provide an argument for them, it is an error.
cout << format("|%5d| %n") % 7 << endl;
// prints "| 7| "
cout << format("|%*.*d|") % 7 << endl;
// prints "|7|"
// truncations of strings :
cout << format("%|.2s| %|8c|.\n") % "root" % "user";
// prints "ro u.\n"
// manipulators conflicting with format-string : manipulators win.
cout << format("%2s") % group(setfill('0'), setw(6), 1) << endl;
// prints "000001"
cout << format("%2$5s %1% %2$3s\n") % 1 % group(setfill('X'), setw(4), 2) ;
// prints "XXX2 1 XXX2\n"
// width is 4, as set by manip, not the format-string.
// nesting :
cout << format("%2$014x [%1%] %2$05s\n") % (format("%05s / %s") % -18 % 7)
% group(showbase, -100);
// prints "0x0000ffffff9c [-0018 / 7] -0100\n"
cout << "\n\nEverything went OK, exiting. \n";
return 0;
}
|