1 // ----------------------------------------------------------------------------
2 // sample_advanced.cc : examples of adanced usage of format
3 // ----------------------------------------------------------------------------
4
5 // Copyright Samuel Krempp 2003. Use, modification, and distribution are
6 // subject to the Boost Software License, Version 1.0. (See accompanying
7 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8
9 // See http://www.boost.org/libs/format for library home page
10
11 // ----------------------------------------------------------------------------
12
13 #include <iostream>
14 #include <iomanip>
15
16 #include "boost/format.hpp"
17
18
19 namespace MyNS_ForOutput {
20 using std::cout; using std::cerr;
21 using std::string;
22 using std::endl; using std::flush;
23
24 using boost::format;
25 using boost::io::group;
26 }
27
28 namespace MyNS_Manips {
29 using std::setfill;
30 using std::setw;
31 using std::hex ;
32 using std::dec ;
33 using std::showbase ;
34 using std::left ;
35 using std::right ;
36 using std::internal ;
37 }
38
main()39 int main(){
40 using namespace MyNS_ForOutput;
41 using namespace MyNS_Manips;
42
43 std::string s;
44
45 //------------------------------------------------------------------------
46 // storing the parsed format-string in a 'formatter' :
47 // format objects are regular objects that can be copied, assigned,
48 // fed arguments, dumped to a stream, re-fed arguments, etc...
49 // So users can use them the way they like.
50
51 format fmter("%1% %2% %3% %1% \n");
52 fmter % 10 % 20 % 30;
53 cout << fmter;
54 // prints "10 20 30 10 \n"
55
56 // note that once the fmter got all its arguments,
57 // the formatted string stays available (until next call to '%')
58 // The result is available via function str() or stream's << :
59 cout << fmter;
60 // prints the same string again.
61
62
63 // once you call operator% again, arguments are cleared inside the object
64 // and it is an error to ask for the conversion string before feeding all arguments :
65 fmter % 1001;
66 try { cout << fmter; }
67 catch (boost::io::too_few_args& exc) {
68 cout << exc.what() << "***Dont worry, that was planned\n";
69 }
70
71 // we just need to feed the last two arguments, and it will be ready for output again :
72 cout << fmter % 1002 % 1003;
73 // prints "1001 1002 1003 1001 \n"
74
75 cout << fmter % 10 % 1 % 2;
76 // prints "10 1 2 10 \n"
77
78
79
80 //---------------------------------------------------------------
81 // using format objects
82
83 // modify the formatting options for a given directive :
84 fmter = format("%1% %2% %3% %2% %1% \n");
85 fmter.modify_item(4, group(setfill('_'), hex, showbase, setw(5)) );
86 cout << fmter % 1 % 2 % 3;
87 // prints "1 2 3 __0x2 1 \n"
88
89 // bind one of the argumets :
90 fmter.bind_arg(1, 18);
91 cout << fmter % group(hex, showbase, 20) % 30; // %2 is 20, and 20 == 0x14
92 // prints "18 0x14 30 _0x14 18 \n"
93
94
95 fmter.modify_item(4, setw(0)); // cancels previous width-5
96 fmter.bind_arg(1, 77); // replace 18 with 77 for first argument.
97 cout << fmter % 10 % 20;
98 // prints "77 10 20 0xa 77 \n"
99
100 try
101 {
102 cout << fmter % 6 % 7 % 8; // Aye ! too many args, because arg1 is bound already
103 }
104 catch (boost::io::too_many_args& exc)
105 {
106 cout << exc.what() << "***Dont worry, that was planned\n";
107 }
108
109 // clear regular arguments, but not bound arguments :
110 fmter.clear();
111 cout << fmter % 2 % 3;
112 // prints "77 2 3 0x2 77 \n"
113
114 // clear_binds() clears both regular AND bound arguments :
115 fmter.clear_binds();
116 cout << fmter % 1 % 2 % 3;
117 // prints "1 2 3 0x2 1 \n"
118
119
120 // setting desired exceptions :
121 fmter.exceptions( boost::io::all_error_bits ^( boost::io::too_many_args_bit ) );
122 cout << fmter % 1 % 2 % 3 % 4 % 5 % 6 ;
123
124
125 // -----------------------------------------------------------
126 // misc:
127
128 // unsupported printf directives %n and asterisk-fields are purely ignored.
129 // do *NOT* provide an argument for them, it is an error.
130 cout << format("|%5d| %n") % 7 << endl;
131 // prints "| 7| "
132 cout << format("|%*.*d|") % 7 << endl;
133 // prints "|7|"
134
135
136 // truncations of strings :
137 cout << format("%|.2s| %|8c|.\n") % "root" % "user";
138 // prints "ro u.\n"
139
140
141 // manipulators conflicting with format-string : manipulators win.
142 cout << format("%2s") % group(setfill('0'), setw(6), 1) << endl;
143 // prints "000001"
144 cout << format("%2$5s %1% %2$3s\n") % 1 % group(setfill('X'), setw(4), 2) ;
145 // prints "XXX2 1 XXX2\n"
146 // width is 4, as set by manip, not the format-string.
147
148 // nesting :
149 cout << format("%2$014x [%1%] %2$05s\n") % (format("%05s / %s") % -18 % 7)
150 % group(showbase, -100);
151 // prints "0x0000ffffff9c [-0018 / 7] -0100\n"
152
153
154 cout << "\n\nEverything went OK, exiting. \n";
155 return 0;
156 }
157