 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Siemel Naran Guest
|
Posted: Thu Jun 26, 2003 2:09 pm Post subject: Re: Center formatted text with streams... |
|
|
"GRalphE" <vaghn (AT) yahoo (DOT) com> wrote in message
| Quote: | If I turn on both left and right, would that produce centered text?
|
No.
| Quote: | Just a lame question.
|
No.
BTW, what should this do
cout << myspace::center << "hello" << 3.0;
Should the "hello" be centered then the 3.0 after it, or should "hello
3.0"
be centered?
Maybe you can write all the text you want centered into a string, then
write
a manipulator to center the string.
There is no portable way to get the number of characters in a line.
Let's
assume it is 80, though perhaps you can use a non-portable function to
get
it like gettextinfo in Windows.
cout << myspace::center(ostringstream() << "hello" << 3.0);
where
class center {
public:
center(ostream& text); // may throw bad_cast
private:
ostringstream& d_text;
};
ostream& operator<<(ostream& out, center c) {
const int screenwidth = 80;
const string& text = d_text.str();
const int textwidth = int(text.size());
int space = (screenwidth - textwidth) / 2;
if (space < 0) space = 0;
out.setfill(' ');
out << setw(space) << "" << text << 'n';
return out;
}
--
+++++++++++
Siemel Naran
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
|
|
| Back to top |
|
 |
Siemel Naran Guest
|
Posted: Thu Jun 26, 2003 2:24 pm Post subject: Re: Center formatted text with streams... |
|
|
"GRalphE" <vaghn (AT) yahoo (DOT) com> wrote in message
| Quote: | If I turn on both left and right, would that produce centered text?
|
No.
| Quote: | Just a lame question.
|
No.
BTW, what should this do
cout << myspace::center << "hello" << 3.0;
Should the "hello" be centered then the 3.0 after it, or should "hello
3.0"
be centered?
Maybe you can write all the text you want centered into a string, then
write
a manipulator to center the string.
There is no portable way to get the number of characters in a line.
Let's
assume it is 80, though perhaps you can use a non-portable function to
get
it.
cout << myspace::center(ostringstream() << "hello" << 3.0);
where
class center {
public:
center(ostream& text); // may throw bad_cast
private:
ostringstream& d_text;
};
ostream& operator<<(ostream& out, center c) {
const int screenwidth = 80;
const string& text = d_text.str();
const int textwidth = int(text.size());
int space = (screenwidth - textwidth) / 2;
if (space < 0) space = 0;
out.setfill(' ');
out << setw(space) << text << 'n';
return out;
}
--
+++++++++++
Siemel Naran
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
|
|
| Back to top |
|
 |
Maciej Sobczak Guest
|
Posted: Thu Jun 26, 2003 7:39 pm Post subject: Re: Center formatted text with streams... |
|
|
Hi,
Siemel Naran wrote:
| Quote: | cout << myspace::center(ostringstream() << "hello" << 3.0);
|
Except that ostringstream() above will create a temporary and the first
operator<< (the one on the right of ostringstream) is non-member
function accepting non-const reference to its left parameter. It is not
possible to bound temporaries to non-const references.
In other words, it is not possible to use temporary stream to insert a
string into it. Funny: you can insert numeric values this way with no
problem.
Even more fun:
ostringstream() << "hello" << 3; // error for the reasons above
ostringstream() << 3 << "hello"; // OK
--
Maciej Sobczak
http://www.maciejsobczak.com/
Distributed programming lib for C, C++, Python & Tcl:
http://www.maciejsobczak.com/prog/yami/
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
|
|
| Back to top |
|
 |
John Potter Guest
|
Posted: Fri Jun 27, 2003 4:44 pm Post subject: Re: Center formatted text with streams... |
|
|
On 26 Jun 2003 10:24:12 -0400, "Siemel Naran" <SiemelNaran (AT) KILL (DOT) att.net>
wrote:
| Quote: | BTW, what should this do
cout << myspace::center << "hello" << 3.0;
Should the "hello" be centered then the 3.0 after it, or should "hello
3.0" be centered?
|
It should produce "hello3" because the width is 0 for both items.
Padding makes no sense without a setw.
cout << myspace::center << setw(9) << "hello" << setw( << 3.0
would give " hello 3 ". Note that it is sticky like all
formatters. How do you clear it?
John
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
|
|
| Back to top |
|
 |
John Potter Guest
|
Posted: Fri Jun 27, 2003 4:45 pm Post subject: Re: Center formatted text with streams... |
|
|
On 26 Jun 2003 15:39:43 -0400, Maciej Sobczak <maciej (AT) maciejsobczak (DOT) com>
wrote:
| Quote: | ostringstream() << "hello" << 3; // error for the reasons above
|
You just need to know how to cheat.
ostringstream() << flush << "hello" << 3;
John
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
|
|
| Back to top |
|
 |
llewelly Guest
|
Posted: Sat Jun 28, 2003 11:32 pm Post subject: Re: Center formatted text with streams... |
|
|
"Siemel Naran" <SiemelNaran (AT) KILL (DOT) att.net> writes:
| Quote: | "Maciej Sobczak" <maciej (AT) maciejsobczak (DOT) com> wrote in message
cout << myspace::center(ostringstream() << "hello" << 3.0);
Except that ostringstream() above will create a temporary and the first
operator<< (the one on the right of ostringstream) is non-member
function accepting non-const reference to its left parameter. It is not
possible to bound temporaries to non-const references.
Good point.
You can have center's constructor center::center(const std::string&).
Or you can write a class my_ostringstream that holds an ostringstream or
derives from one, and write a member template operator<<.
class my_ostringstream : public std::ostringstream {
public:
template
my_ostringstream& operator<<(const T& arg) const {
std::ostringstream << arg;
return *this;
}
};
The center's constructor can take a my_ostringstream& as an argument and
there's no need for dynamic_cast.
In other words, it is not possible to use temporary stream to insert a
string into it. Funny: you can insert numeric values this way with no
problem.
Even more fun:
ostringstream() << "hello" << 3; // error for the reasons above
ostringstream() << 3 << "hello"; // OK
Why is the 2nd one OK?
|
Because you can pass a temporary to a non-const member function.
However you cannot bind a temporary to a reference to non-const.
More unecessary incompatibility between member and non-member
functions. More reason to prefer non-member functions to member
functions, wherever reasonable.
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Mon Jun 30, 2003 4:04 pm Post subject: Re: Center formatted text with streams... |
|
|
John Potter <jpotter (AT) falcon (DOT) lhup.edu> wrote
| Quote: | On 26 Jun 2003 10:24:12 -0400, "Siemel Naran"
[email]SiemelNaran (AT) KILL (DOT) att.net[/email]
wrote:
BTW, what should this do
cout << myspace::center << "hello" << 3.0;
Should the "hello" be centered then the 3.0 after it, or should
"hello
3.0" be centered?
It should produce "hello3" because the width is 0 for both items.
Padding makes no sense without a setw.
cout << myspace::center << setw(9) << "hello" << setw( << 3.0
would give " hello 3 ". Note that it is sticky like all
formatters. How do you clear it?
|
The same way you clear ios::left and ios::right ?
--
James Kanze GABI Software
mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
http://www.gabi-soft.fr
Beratung in objektorientierter
Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, Tél. : +33 (0)1 30 23 45
16
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
|
|
| Back to top |
|
 |
Powered by phpBB © 2001, 2006 phpBB Group
|