The <sstream>
header declares classes, templates, and other types for
reading from and writing to strings in the same manner as reading from
and writing to files.
See Chapter 9 for a general
discussion of I/O, Chapter 1 for
more information about character sets, and the <iostream>
section in this chapter for
information about the base-class templates required by the stringstream
class templates. Refer to Chapter 8 for information about traits in
general and to the <string>
section in this chapter for detailed information about the char_traits
template. Refer to the <streambuf>
section in this chapter for
information about the basic_streambuf
template. See also <strstream>
for classes that are similar to the string streams, except they work
with arrays of narrow characters.
To read from a string, use istringstream
; for writing, use ostringstream
; for reading and writing, use
stringstream
. For wide character I/O,
use wistringstream
, wostringstream
, or wstringstream
. Example 13-35 shows tostring
, a simple use of ostringstream
to convert a value to a string.
(Think of tostring
as the inverse of
strtol
and friends.)
Example 13-35. Converting a value to a string
template<typename T> std::string tostring(const T& x) { std::ostringstream out; out << x; return out.str( ); }
Example 13-36 shows a
use of istringstream
to interpret
HTML colors. In HTML, a color can be a name, such as white
, or a hexadecimal digit string that
begins with #
. The digit string is
interpreted as a triplet of red, green, and blue color elements, each
expressed as two hexadecimal digits. For the sake of simplicity, the
example omits error handling and assumes that the order of the color
elements matches the order needed by the program. The known color names
are stored in a map
.
Example 13-36. Interpreting an HTML color string
typedef std::map<std::string, unsigned long> colormap; colormap colors; unsigned long get_color(const std::string& text) { unsigned long rgb; colormap::iterator i = colors.find(text); if (i != colors.end( )) return i->second; else if (text.length( ) == 0) return 0; else { std::istringstream in(text); if (in.peek( ) == '#') in.ignore( ); in >> std::noskipws >> std::hex >> rgb; if (in) return rgb; else return 0; } } void initcolors(colormap& colors) { . . . colors["black"] = 0x000000; colors["blue"] = 0x0000FF; colors["green"] = 0x00FF00; colors["red"] = 0xFF0000; colors["white"] = 0xFFFFFF; }