Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_33_1/libs/format/example/sample_advanced.cpp @ 12

Last change on this file since 12 was 12, checked in by landauf, 17 years ago

added boost

File size: 5.0 KB
Line 
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
19namespace 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
28namespace 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
39int 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}
Note: See TracBrowser for help on using the repository browser.