______________________________________________________________________ 27 Input/output library [lib.input.output] ______________________________________________________________________ 1 This clause describes components that C++ programs may use to perform input/output operations. 2 The following subclauses describe requirements for stream parameters, and components for forward declarations of iostreams, predefined iostreams objects, base iostreams classes, stream buffering, stream formatting and manipulators, string streams, and file streams, as sum marized in Table 1: Table 1--Input/output library summary +----------------------------------------------------------------+ | Subclause Header(s) | +----------------------------------------------------------------+ |_lib.iostreams.requirements_ Requirements | +----------------------------------------------------------------+ |_lib.iostream.forward_ Forward declarations <iosfwd> | +----------------------------------------------------------------+ |_lib.iostream.objects_ Standard iostream objects <iostream> | +----------------------------------------------------------------+ |_lib.iostreams.base_ Iostreams base classes <ios> | +----------------------------------------------------------------+ |_lib.stream.buffers_ Stream buffers <streambuf> | +----------------------------------------------------------------+ | <istream> | |_lib.iostream.format_ Formatting and manipulators <ostream> | | <iomanip> | +----------------------------------------------------------------+ |_lib.string.streams_ String streams <sstream> | | <cstdlib> | +----------------------------------------------------------------+ | <cstream> | |_lib.file.streams_ File streams <fstream> | | <cstdio> | | <cwchar> | +----------------------------------------------------------------+ 27.1 Iostreams requirements [lib.iostreams.requirements] 27.1.1 Definitions [lib.iostreams.definitions] 1 Additional definitions: --character In this clause, the term ``character'' means the general ized element of text data. Each text data consist of a sequence of character. So the term does not only means the char type object, and the wchar_t type object, but also any sort of classes which pro vides the definitions specified in (_lib.string.char.traits_). --character container type Character container type is a class or a type which represents a character. It is used for one of the tem plate parameter of the template iostream classes. --template iostream classes The template iostream classes are the tem plate classes which takes two template parameters: charT and traits. The class, charT, represents the character container class and the class, traits, represents the traits structure which provides the definition of the functionality necessary to implement the template iostream classes. --narrow-oriented iostream classes The narrow-oriented iostream classes are the versions of the template iostream classes special ized with the character container class, char. The traditional iostream classes are regarded as the narrow-oriented iostream classes (_lib.narrow.stream.objects_). --wide-oriented iostream classes The wide-oriented iostream classes are the versions of the template iostream classes specialized with the character container class, wchar_t (_lib.wide.stream.objects_). --repositional streams and arbitrary-positional streams There are two types of stream: repositional and arbitrary-positional. +------- BEGIN BOX 1 -------+ There are also non-positional streams in which no seeking is possible. +------- END BOX 1 -------+ 2 With a repositional stream, we can seek to only the position where we previously encountered. On the other hand, with an arbitrary- positionalstream, we can seek to any integral position within the length of the stream. 3 For a stream buffer which is corresponding to a repositional stream (but not an arbitrary-positional stream), all we can do is either to fetch the current position of the stream buffer or to specify the pre vious position which we have already fetched from the stream buffer. 4 Every arbitrary-positional stream is repositional. 5 If a repositional stream returns a POS_T object, and some arithmetic operations ( operator+=, operator-, operator+=, operator-=) are applied, the behavior of the stream after restoring the position with the modified POS_T object is undefined. It means that a POS_T object whose parent stream is repositional shall not apply any arithmetic operations. 6 It is not ensured that in case the validity of a certain POS_T object is broken, the error shall be informed. Or there is no way to check the validity of a certain POS_T object. --Invalid POS_T value The stream operations whose return type is POS_T may return POS_T((OFF_T)(-1)) as signal to some error occurs. This return value is called the invalid POS_T value. The conversion POS_T((OFF_T)(-1)) constructs the invalid POS_T value, which is available only for comparing to the return value of such member functions. 27.1.2 Type requirements [lib.iostreams.type.reqmts] 1 There are several types and functions needed for implementing the tem plate iostream classes. Some of these types and functions depend on the definition of the character container type. The collection of these functions describes the behavior which the implementation of the template iostream class expects to the character container class. 27.1.2.1 Type CHAR_T [lib.iostreams.char.t] 1 Those who provide a character container type as the template parameter have to provide all of these functions as well as the container class itself. The collection of these functions can be regarded as the col lection of the common definitions for the implementation of the char acter container class. 2 No special definition/declaration is provided here. The base class (or struct), string_char_traits provides the definitions common between the template string classes and the template iostream classes. 3 Convertible to type INT_T. 27.1.2.2 Type INT_T [lib.iostreams.int.t] 1 Another character container type which can also hold an end-of-file value. It is used as the return type of some of the iostream class member functions. If CHAR_T is either char or wchar_t, INT_T shall be int or wint_t, respectively. 27.1.2.3 Type OFF_T [lib.iostreams.off.t] 1 A type that can represent offsets to positional information.1) It is _________________________ 1) It is usually a synonym for one if the signed basic integral types whose representation at least as many bits as type long. used to represent: --a signed displacement, measured in characters, from a specified position within a sequence. --an absolute position within a sequence. 2 The value OFF_T(-1) can be used as an error indicator. 3 If an OFF_T object has a value other than the parent stream returns (for example, assigned an arbitrary integer), the value may not apply to any streams. 4 Convertible to type POS_T.2) But no validity of the resulting POS_T value is ensured, whether or not the OFF_T value is valid. 27.1.2.4 Type POS_T [lib.iostreams.pos.t] 1 An implementation-defined type for seek operations which describes an object that can store all the information necessary to reposition to the position. 2 The type POS_T describes an object that can store all the information necessary to restore an arbitrary sequence to a previous stream posi tion and conversion state.3) 3 A class or built-in type P satisfies the requirements of a position type, and a class or built-in type O satisfies the requirements of an offset type if the following expressions are valid, as shown in Table 2. 4 In the following table, --P refers to type POS_T, --p and q refer to an values of type POS_T, --O refers to type OFF_T, --o refers to a value of type OFF_T, and --i refers to a value of type int. _________________________ 2) An implementation may use the same type for both OFF_T and POS_T. 3) The conversion state is used for sequences that translate between wide-character and generalized multibyte encoding, as described in Amendment 1 to the C Standard. Table 2--Position type requirements +--------------------------------------------------------------------------------+ |expression return type operational assertion/note | | semantics pre/post-condition | +--------------------------------------------------------------------------------+ |P(i) p == P(i) | | note: a destructor is assumed. | +--------------------------------------------------------------------------------+ |P p(i); | |P p = i; post: p == P(i). | +--------------------------------------------------------------------------------+ |P(o) POS_T converts from offset | +--------------------------------------------------------------------------------+ |O(p) OFF_T converts to offset | +--------------------------------------------------------------------------------+ |p == q convertible to bool == is an equivalence relation | +--------------------------------------------------------------------------------+ |p != q convertible to bool !(p==q) | +--------------------------------------------------------------------------------+ |q = p + o POS_T + offset q-o == p | |p += o | +--------------------------------------------------------------------------------+ |q = p - o POS_T - offset q+o == p | |p -= o | +--------------------------------------------------------------------------------+ |o = p - q OFF_T distance q+o == p | +--------------------------------------------------------------------------------+ 27.2 Forward declarations [lib.iostream.forward] Header <iosfwd> synopsis namespace std { template<class charT> class basic_ios; template<class charT> class basic_istream; template<class charT> class basic_ostream; typedef basic_ios<char> ios; typedef basic_ios<wchar_t> wios; typedef basic_istream<char> istream; typedef basic_istream<wchar_t> wistream; typedef basic_ostream<char> ostream; typedef basic_ostream<wchar_t> wostream; } 1 The template class basic_ios<charT,traits> serves as a base class for the classes basic_istream<charT,traits> and basic_ostream<charT,traits>. 2 The class ios is an instance of the template class basic_ios, special ized by the type char. 3 The class wios is a version of the template class basic_ios special ized by the type wchar_t. 27.3 Standard iostream objects [lib.iostream.objects] Header <iostream> synopsis #include <fstream> namespace std { extern ifstream cin; extern ofstream cout; extern ofstream cerr; extern ofstream clog; extern wifstream win; extern wofstream wout; extern wofstream werr; extern wofstream wlog; } 1 The header <iostream> declares objects that associate objects with the standard C streams provided for by the functions declared in <cstdio> (_lib.c.files_). 2 Mixing operations on corresponding wide- and narrow-character streams follows the same semantics as mixing such operations on FILE s, as specified in Amendment 1 of the ISO C standard. +------- BEGIN BOX 2 -------+ ISSUE: These objects need to be constructed and associations estab lished before dynamic initialization of file scope variables is begun. +------- END BOX 2 -------+ The objects are constructed, and the associations are established, the first time an object of class basic_ios<charT,traits>::Init is con structed. The objects are not destroyed during program execution.4) 27.3.1 Narrow stream objects [lib.narrow.stream.objects] 27.3.1.1 Object cin [lib.cin] ifstream cin; _________________________ 4) Constructors and destructors for static objects can access these objects to read input from stdin or write output to stdout or stderr. 1 The object cin controls input from an unbuffered stream buffer associ ated with the object stdin, declared in <cstdio>. 2 After the object cin is initialized, cin.tie() returns cout. 27.3.1.2 Object cout [lib.cout] ofstream cout; 1 The object cout controls output to an unbuffered stream buffer associ ated with the object stdout, declared in <cstdio> (_lib.c.files_). 27.3.1.3 Object cerr [lib.cerr] ofstream cerr; 1 The object cerr controls output to an unbuffered stream buffer associ ated with the object stderr, declared in <cstdio> (_lib.c.files_). 2 After the object cerr is initialized, cerr.flags() & unitbuf is nonzero. 27.3.1.4 Object clog [lib.clog] ofstream clog; 1 The object clog controls output to a stream buffer associated with the object stderr, declared in <cstdio> (_lib.c.files_). +------- BEGIN BOX 3 -------+ ISSUE: The destination of clog ought to be implementation defined. +------- END BOX 3 -------+ 27.3.2 Wide stream objects [lib.wide.stream.objects] 1 27.3.2.1 Object win [lib.win] wifstream win; 1 The object win controls input from an unbuffered stream buffer associ ated with the object stdin, declared in <cstdio>. 2 After the object win is initialized, win.tie() returns wout. 27.3.2.2 Object wout [lib.wout] wofstream wout; 1 The object wout controls output to an unbuffered stream buffer associ ated with the object stdout, declared in <cstdio> (_lib.c.files_). 27.3.2.3 Object werr [lib.werr] wofstream werr; 1 The object werr controls output to an unbuffered stream buffer associ ated with the object stderr, declared in <cstdio> (_lib.c.files_). 2 After the object werr is initialized, werr.flags() & unitbuf is nonzero. 27.3.2.4 Object wlog [lib.wlog] wofstream wlog; 1 The object wlog controls output to a stream buffer associated with the object stderr, declared in <cstdio> (_lib.c.files_). +------- BEGIN BOX 4 -------+ ISSUE: The destination of wlog ought to be implementation defined. +------- END BOX 4 -------+ 27.4 Iostreams base classes [lib.iostreams.base] Header <ios> synopsis namespace std { typedef OFF_T streamoff; typedef OFF_T wstreamoff; typedef INT_T streamsize; template <class charT> struct ios_traits<charT>; struct ios_traits<char>; struct ios_traits<wchar_t>; class ios_base; template<class charT, class traits = ios_traits<charT> > class basic_ios; typedef basic_ios<char> ios; typedef basic_ios<wchar_t> wios; // _lib.std.ios.manip_, manipulators: ios_base& boolalpha (ios_base& str); ios_base& noboolalpha(ios_base& str); ios_base& showbase (ios_base& str); ios_base& noshowbase (ios_base& str); ios_base& showpoint (ios_base& str); ios_base& noshowpoint(ios_base& str); ios_base& showpos (ios_base& str); ios_base& noshowpos (ios_base& str); ios_base& skipws (ios_base& str); ios_base& noskipws (ios_base& str); ios_base& uppercase (ios_base& str); ios_base& nouppercase(ios_base& str); // adjustfield: ios_base& internal (ios_base& str); ios_base& left (ios_base& str); ios_base& right (ios_base& str); // basefield: ios_base& dec (ios_base& str); ios_base& hex (ios_base& str); ios_base& oct (ios_base& str); // floatfield: ios_base& fixed (ios_base& str); ios_base& scientific (ios_base& str); } 27.4.1 Types [lib.stream.types] 27.4.1.1 Type streamoff [lib.streamoff] typedef OFF_T streamoff; 1 The type streamoff is an implementation-defined type that satisfies the requirements of type OFF_T(_lib.iostreams.off.t_). 27.4.1.2 Type wstreamoff [lib.wstreamoff] typedef OFF_T wstreamoff; 1 The type wstreamoff is an implementation-defined type that satisfies the requirements of type OFF_T(_lib.iostreams.off.t_). 27.4.1.3 Type streampos [lib.streampos] typedef POS_T streampos; 1 The type streampos is an implementation-defined type that satisfies the requirements of type POS_T(_lib.iostreams.pos.t_). 27.4.1.4 Type wstreampos [lib.wstreampos] typedef POS_T wstreampos; 1 The type streampos is an implementation-defined type that satisfies the requirements of type POS_T(_lib.iostreams.pos.t_). 27.4.1.5 Type streamsize [lib.streamsize] typedef INT_T streamsize; 1 The type streamsize is a synonym for one of the signed basic integral types. It is used to represent the number of characters transferred in an I/O operation, or the size of I/O buffers.5) 27.4.2 Template struct ios_traits [lib.ios.traits] namespace std { template <class charT> struct ios_traits<charT> { typedef charT char_type; typedef INT_T int_type; typedef POS_T pos_type; typedef OFF_T off_type; typedef INT_T state_type; static char_type to_char_type(int_type); static int_type to_int_type (char_type); static bool eq_char_type(char_type, char_type); static bool eq_int_type (int_type, int_type); static int_type eof(); static int_type not_eof(char_type c); static bool is_eof (int_type); static char_type newline(); static bool is_whitespace(ctype<char_type> ctype, char_type c); static char_type eos(); static size_t length(const char_type* s); static char_type* copy(char_type* dst, const char_type* src, size_t n) ; }; } 1 The template struct ios_traits<charT> is a traits class which main tains the definitions of the types and functions necessary to imple ment the template iostream classes. The template parameter charT rep resents the character container type and each specialized version pro vides the default definitions corresponding to the specialized charac ter container type. _________________________ 5) streamsize is used in most places where ISO C would use size_t. Most of the uses of streamsize could use size_t, except for the strstreambuf constructors, which require negative values. It should probably be the signed type corresponding to size_t (which is what Posix.2 calls ssize_t). 2 An implementation may provide the following two specializations of ios_traits: struct ios_traits<char> struct ios_traits<wchar_t>; 27.4.2.1 Member functions [lib.ios.traits.members] 27.4.2.1.1 [lib.ios.char.traits::to.char.type] ios_traits::to_char_type char_type to_char_type(int_type c); Effects: Converts a valid character value represented in the int_type to the corresponding char_type value. If c is the end-of-file value, the return value is unspecified. 27.4.2.1.2 [lib.ios.char.traits::to.int.type] ios_traits::to_int_type int_type to_int_type(char_type c); Effects: Converts a valid character value represented in the char_type to the corresponding int_type value. 27.4.2.1.3 [lib.ios.char.traits::eq.char.type] ios_traits::eq_char_type bool eq_char_type(char_type c1, char_type c2); Returns: true if c1 and c2 represent the same character. 27.4.2.1.4 [lib.ios.char.traits::eq.int.type] ios_traits::eq_int_type bool eq_int_type(int_type c1, int_type c2); Returns: true if c1 and c2 represent the same character. 27.4.2.1.5 ios_traits::eof [lib.ios.char.traits::eof] int_type eof(); Returns: an int_type value which represents the end-of-file. It is returned by several functions to indicate end-of-file state (no more input from an input sequence or no more output permitted to an output sequence), or to indicate an invalid return value. 27.4.2.1.6 ios_traits::not_eof [lib.ios.char.traits::not.eof] int_type not_eof(char_type c); +------- BEGIN BOX 5 -------+ Should the argument type be int_type? +------- END BOX 5 -------+ Returns: a value other than the end-of-file, even if c==eof(). Notes: It is used in basic_streambuf<charT,traits>::overflow(). Returns: int_type(c) if c!=eof(). 27.4.2.1.7 ios_traits::is_eof [lib.ios.char.traits::is.eof] bool is_eof(int_type c); Returns: true if c represents the end-of-file. 27.4.2.1.8 ios_traits::newline [lib.ios.char.traits::newline] char_type newline(); Returns: a character value which represent the newline character of the basic character set. Notes: It appears as the default parameter of basic_istream<charT,traits>::getline(). 27.4.2.1.9 [lib.ios.char.traits::is.whitespace] ios_traits::is_whitespace bool is_whitespace(char_type c, ctype<char_type> ctype); Returns: true if c represents one of the white space characters. The default definition is as if it returns ctype .isspace(c). 1 An implementation of the template iostream classes may use all of the above static member functions in addition to the following three func tions provided from the base struct string_char_traits<CHAR_T>. 27.4.2.1.10 ios_traits::eos [lib.ios.char.traits::eos] char_type eos(); Returns: The null character which is used for the terminator of null terminated character strings. The default constructor for the char acter container type provides the value. 27.4.2.1.11 ios_traits::length [lib.ios.char.traits::length] size_t length(const char_type* s); Effects: Determines the length of a null terminated character string pointed to by s. 27.4.2.1.12 ios_traits::copy [lib.ios.char.traits::copy] char_type* copy(char_type* dest, const char_type* src, size_t n); Effects: Copies n characters from the object pointed to by src into the object pointed to by dest. If copying takes place between objects that overlap, the behavior is undefined. 27.4.3 Class ios_base [lib.ios.base] namespace std { class ios_base { class failure; typedef T1 fmtflags; static const fmtflags boolalpha; static const fmtflags dec; static const fmtflags fixed; static const fmtflags hex; static const fmtflags internal; static const fmtflags left; static const fmtflags oct; static const fmtflags right; static const fmtflags scientific; static const fmtflags showbase; static const fmtflags showpoint; static const fmtflags showpos; static const fmtflags skipws; static const fmtflags unitbuf; static const fmtflags uppercase; static const fmtflags adjustfield; static const fmtflags basefield; static const fmtflags floatfield; typedef T2 iostate; static const iostate badbit; static const iostate eofbit; static const iostate failbit; static const iostate goodbit; typedef T3 openmode; static const openmode app; static const openmode ate; static const openmode binary; static const openmode in; static const openmode out; static const openmode trunc; typedef T4 seekdir; static const seekdir beg; static const seekdir cur; static const seekdir end; class Init; operator bool() const bool operator!() const ios_type& copyfmt(const ios_type& rhs); iostate rdstate() const; void clear(iostate state = goodbit); void setstate(iostate state); bool good() const; bool eof() const; bool fail() const; bool bad() const; iostate exceptions() const; void exceptions(iostate except); fmtflags flags() const; fmtflags flags(fmtflags fmtfl); fmtflags setf(fmtflags fmtfl); fmtflags setf(fmtflags fmtfl, fmtflags mask); void unsetf(fmtflags mask); int_type fill() const; int_type fill(int_type ch); int precision() const; int precision(int prec); int width() const; int width(int wide); locale imbue(const locale& loc); locale getloc() const; static int xalloc(); long& iword(int index); void*& pword(int index); protected: // ? ios_base(); private: // static int index; exposition only // int* iarray; exposition only // void** parray; exposition only }; } +------- BEGIN BOX 6 -------+ ISSUE: fill can't work in the non-template base class. Specifying fill character. It is represented as int_type. +------- END BOX 6 -------+ 1 ios_base defines several member types: --a class failure derived from exception; --a class Init; --three bitmask types, fmtflags, iostate, and openmode; --an enumerated type, seekdir. 2 It maintains several kinds of data: --state information that reflects the integrity of the stream buffer; --control information that influences how to interpret (format) input sequences and how to generate (format) output sequences; --additional information that is stored by the program for its private use. +------- BEGIN BOX 7 -------+ For the sake of exposition, the maintained data is presented here as: --static int index, specifies the next available unique index for the integer or pointer arrays maintained for the private use of the pro gram, initialized to an unspecified value; --int* iarray, points to the first element of an arbitrary-length integer array maintained for the private use of the program; --void** parray, points to the first element of an arbitrary-length pointer array maintained for the private use of the program. +------- END BOX 7 -------+ 27.4.3.1 Types [lib.ios.types] 27.4.3.1.1 Class ios_base::failure [lib.ios::failure] namespace std { class ios_base::failure : public exception { public: failure(const string& what = message); virtual ~failure(); // virtual string what() const; inherited }; } 1 The class failure defines the base class for the types of all objects thrown as exceptions, by functions in the iostreams library, to report errors detected during stream buffer operations. 27.4.3.1.1.1 ios_base::failure [lib.ios.base::failure.cons] constructor failure(const string& what = message); Effects: Constructs an object of class failure, initializing the base class with exception(what). 1 The string message is an implementation-defined default value. 27.4.3.1.2 Type ios_base::fmtflags [lib.ios::fmtflags] typedef T1 fmtflags; 1 The type fmtflags is a bitmask type (_lib.bitmask.types_). Setting its elements has the effects indicated in Table 3: Table 3--fmtflags effects +---------------------------------------------------------------------+ | Element Effect(s) if set | +---------------------------------------------------------------------+ | boolalpha insert and extract bool type in alpha | | betic format | | dec converts integer input or generates in | | teger output in decimal base | | fixed generate floating-point output in fixed- | | point notation; | | hex converts integer input or generates in | | teger output in hexadecimal base; | | internal adds fill characters at a designated in | | ternal point in certain generated out | | put; | | left adds fill characters on the left (ini | | tial positions) of certain generated | | output; | | oct converts integer input or generates in | | teger output in octal base; | | right adds fill characters on the right (final | | positions) of certain generated output; | | scientific generates floating-point output in sci | | entific notation; | | showbase generates a prefix indicating the numer | | ic base of generated integer output; | | showpoint generates a decimal-point character un | | conditionally in generated floating- | | point output; | | showpos generates a + sign in non-negative gen | | erated numeric output; | | skipws skips leading white space before certain | | input operations; | | unitbuf flushes output after each output opera | | tion; | | uppercase replaces certain lowercase letters with | | their uppercase equivalents in generated | | output. | +---------------------------------------------------------------------+ 2 Type fmtflags also defines the constants indicated in Table 4: Table 4--fmtflags constants +--------------------------------------+ | Constant Allowable values | +--------------------------------------+ |adjustfield left | right | internal | |basefield dec | oct | hex | |floatfield scientific | fixed | +--------------------------------------+ 27.4.3.1.3 Type ios_base::iostate [lib.ios::iostate] typedef T2 iostate; 1 The type iostate is a bitmask type (_lib.bitmask.types_) that contains the elements indicated in Table 5: Table 5--iostate effects +---------------------------------------------------------------------+ | Element Effect(s) if set | +---------------------------------------------------------------------+ | badbit indicates a loss of integrity in an in | | put or output sequence (such as an ir | | recoverable read error from a file); | | eofbit indicates that an input operation | | reached the end of an input sequence; | | failbit indicates that an input operation failed | | to read the expected characters, or that | | an output operation failed to generate | | the desired characters. | +---------------------------------------------------------------------+ 2 Type iostate also defines the constant: --goodbit, the value zero. 27.4.3.1.4 Type ios_base::openmode [lib.ios::openmode] typedef T3 openmode; 1 The type openmode is a bitmask type (_lib.bitmask.types_). It con tains the elements indicated in Table 6: Table 6--openmode effects +---------------------------------------------------------------------+ | Element Effect(s) if set | +---------------------------------------------------------------------+ | app seek to end-of-file before each write to | | the file | | ate open a file and seek to end-of-file im | | mediately after opening the file | | binary perform input and output in binary mode | | (as opposed to text mode) | | in open a file for input | | out open a file for output | | trunc truncate an existing file when opening | | it | +---------------------------------------------------------------------+ 27.4.3.1.5 Type ios_base::seekdir [lib.ios::seekdir] typedef T4 seekdir; 1 The type seekdir is an enumerated type (_lib.enumerated.types_) that contains the elements indicated in Table 7: Table 7--seekdir effects +---------------------------------------------------------------------+ | Element Meaning | +---------------------------------------------------------------------+ | beg request a seek (positioning for subse | | quent input or output within a sequence) | | relative to the beginning of the stream | | cur request a seek relative to the current | | position within the sequence | | end request a seek relative to the current | | end of the sequence | +---------------------------------------------------------------------+ 27.4.3.1.6 Class ios_base::Init [lib.ios::Init] namespace std { class ios_base::Init { public: Init(); ~Init(); private: // static int init_cnt; exposition only }; } 1 The class Init describes an object whose construction ensures the con struction of the four objects declared in <iostream> that associate file stream buffers with the standard C streams provided for by the functions declared in <cstdio> (_lib.c.files_). +------- BEGIN BOX 8 -------+ For the sake of exposition, the maintained data is presented here as: --static int init_cnt, counts the number of constructor and destructor calls for class Init, initialized to zero. +------- END BOX 8 -------+ 27.4.3.1.6.1 ios_base::Init [lib.ios.base::init.cons] constructor Init(); Effects: Constructs an object of class Init. If init_cnt is zero, the func tion stores the value one in init_cnt, then constructs and initial izes the objects cin (_lib.cin_), cout (_lib.cout_), cerr (_lib.cerr_), clog (_lib.clog_), win (_lib.win_), wout (_lib.wout_), werr (_lib.werr_), and wlog (_lib.wlog_). In any case, the function then adds one to the value stored in init_cnt. 27.4.3.1.6.2 ios_base::Init destructor [lib.ios.base::init.des] ~Init(); Effects: Destroys an object of class Init. The function subtracts one from the value stored in init_cnt and, if the resulting stored value is one, calls cout.flush(), cerr.flush(), and clog.flush(). 27.4.3.2 Member functions [lib.ios.members] 27.4.3.2.1 ios_base::operator bool [lib.ios::operator.bool] operator bool() const Returns: fail() | bad(). 27.4.3.2.2 ios_base::operator! [lib.ios::operator!] bool operator!() const Returns: if fail() | bad(). 27.4.3.2.3 ios_base::copyfmt [lib.ios::copyfmt] ios_base<charT,traits>& copyfmt(const ios_base<charT,traits>& rhs); Effects: Assigns to the member objects of *this the corresponding member objects of rhs, except that: --sb and rdstate() are left unchanged; --exceptions() is altered last by calling exception(rhs.except). --The contents of arrays pointed at by pword and iword are copied not the pointers themselves.6) 1 If any newly stored pointer values in *this point at objects stored outside the object rhs, and those objects are destroyed when rhs is destroyed, the newly stored pointer values are altered to point at newly constructed copies of the objects. Returns: *this. 27.4.3.2.4 ios_base::rdstate [lib.ios::rdstate] iostate rdstate() const; Returns: The control state of the stream buffer. 27.4.3.2.5 ios_base::clear(iostate) [lib.ios::clear.basic.ios] void clear(iostate state = goodbit); Postcondition: state == rdstate(). Effects: If sb is a null pointer, the function sets badbit in rdstate(). If rdstate() & exceptions() is zero, returns. Otherwise, the function throws an object fail of class failure, constructed with argument _________________________ 6) This suggests an infinite amount of copying, but the implementation can keep track of the maximum element of the arrays that is non-zero. values that are implementation-defined. 27.4.3.2.6 [lib.ios::setstate.basic.ios] ios_base::setstate(iostate) void setstate(iostate state); Effects: Calls clear(rdstate() | state). 27.4.3.2.7 ios_base::good [lib.ios::good] bool good() const; Returns: rdstate() == 0 27.4.3.2.8 ios_base::eof [lib.ios::eof] bool eof() const; Returns: true if eofbit is set in rdstate(). 27.4.3.2.9 ios_base::fail [lib.ios::fail] bool fail() const; Returns: true if failbit or badbit is set in rdstate().7) 27.4.3.2.10 ios_base::bad [lib.ios::bad] bool bad() const; Returns: true if badbit is set in rdstate(). 27.4.3.2.11 ios_base::exceptions [lib.ios::exceptions] iostate exceptions() const; Returns: A mask that determines what elements set in rdstate() cause excep tions to be thrown. void exceptions(iostate except); Postcondition: except == exceptions(). _________________________ 7) Checking badbit also for fail() is historical practice. Effects: Calls clear(rdstate()). 27.4.3.2.12 ios_base::flags [lib.ios::flags] fmtflags flags() const; Returns: The format control information for both input and output. fmtflags flags(fmtflags fmtfl); Postcondition: fmtfl == flags(). Returns: The previous value of flags(). 27.4.3.2.13 ios_base::setf(fmtflags) [lib.ios::setf] fmtflags setf(fmtflags fmtfl); Effects: Sets fmtfl in flags(). Returns: The previous value of flags(). fmtflags setf(fmtflags fmtfl, fmtflags mask); Effects: Clears mask in flags(), sets fmtfl & mask in flags(). Returns: The previous value of flags(). 27.4.3.2.14 ios_base::unsetf(fmtflags) [lib.ios::unsetf] void unsetf(fmtflags mask); Effects: Clears mask in flags(). 27.4.3.2.15 basic_ios::fill [lib.ios::fill] int_type fill() const; Returns: The character to use to pad (fill) an output conversion to the spec ified field width. int_type fill(int_type fillch); Postcondition: fillch == fill(). Returns: The previous value of fill(). 27.4.3.2.16 ios_base::precision [lib.ios::precision] int precision() const; Returns: The precision (number of digits after the decimal point) to generate on certain output conversions. int precision(int prec); Postcondition: prec == precision(). Returns: The previous value of precision(). 27.4.3.2.17 ios_base::width [lib.ios::width] int width() const; Returns: The field width (number of characters) to generate on certain output conversions. int width(int wide); Postcondition: wide == width(). Returns: The previous value of width(). 27.4.3.2.18 ios_base::imbue [lib.ios::imbue] locale imbue(const locale loc); Postcondition: loc == getloc(). Notes: In case the member pointer sb of the basic_streambuf<charT,traits> has already initialized, the function also imbues the object pointed to by sb. Returns: The previous value of getloc(). 27.4.3.2.19 ios_base::getloc [lib.ios::getloc] locale getloc() const; Returns: The classic C locale if no locale has been imbued. Otherwise, returns the locale in which to perform locale-dependent input and output operations. 27.4.3.2.20 ios_base::xalloc [lib.ios::xalloc] static int xalloc(); Returns: index ++. 27.4.3.2.21 ios_base::iword [lib.ios::iword] long& iword(int idx); Effects: If iarray is a null pointer, allocates an array of int of unspeci fied size and stores a pointer to its first element in iarray. The function then extends the array pointed at by iarray as necessary to include the element iarray[idx]. Each newly allocated element of the array is initialized to zero. Returns: iarray[idx]. Notes: After a subsequent call to iword(int) for the same object, the ear lier return value may no longer be valid.8) 27.4.3.2.22 ios_base::pword [lib.ios::pword] void* & pword(int idx); Effects: If parray is a null pointer, allocates an array of pointers to void of unspecified size and stores a pointer to its first element in parray. The function then extends the array pointed at by parray as necessary to include the element parray[idx]. Each newly allocated element of the array is initialized to a null pointer. Returns: parray[idx]. Notes: After a subsequent call to pword(int) for the same object, the ear lier return value may no longer be valid. 27.4.3.2.23 ios_base constructor [lib.ios.base.cons] ios_base(); Effects: Constructs an object of class ios_base, assigning initial values to its member objects by calling init(0). _________________________ 8) An implementation is free to implement both the integer array pointed at by iarray and the pointer array pointed at by parray as sparse data structures, possibly with a one-element cache for each. 27.4.3.2.24 ios_base::init [lib.ios.base::init] void init(basic_streambuf<charT,traits>* sb); Effects: The postconditions of this function are indicated in Table 8: Table 8--init effects +--------------------------------------------------------+ | Element Value | +--------------------------------------------------------+ |rdstate() goodbit if sb is not a null pointer, | | otherwise badbit. | |exceptions() goodbit | |flags() skipws | dec | |width() zero | |precision() 6 | |fill() the space character | |getloc() new locale(), which means the default | | value is the current global locale;9) | |index ??? | |iarray a null pointer | |parray a null pointer | +--------------------------------------------------------+ +------- BEGIN BOX 9 -------+ Note: the default locale value shall be global but not transparent because the locality of the stream buffer will be unchanged between its lifetime. +------- END BOX 9 -------+ 27.4.4 Template class basic_ios [lib.ios] namespace std { template<class charT, class traits = ios_traits<charT> > class basic_ios : public ios_base { typedef basic_ios<charT,traits> ios_type; public: // Added for consistency: typedef INT_T streamsize; typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } _________________________ 9) Usually, classic(). basic_ios(basic_streambuf<charT,traits>* sb); virtual ~basic_ios(); basic_ostream<charT,traits>* tie() const; basic_ostream<charT,traits>* tie(basic_ostream<charT,traits>* tiestr); basic_streambuf<charT,traits>* rdbuf() const; basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb); protected: basic_ios(); void init(basic_streambuf<charT,traits>* sb); }; } +------- BEGIN BOX 10 -------+ Note: template parameter coupling between basic_ios and basic_streambuf: Both basic_ios and basic_streambuf corresponding to it should take the same template parameter <charT,traits>. We need not allow to make a couple of basic_ios<wchar_t> and basic_streambuf<char>. +------- END BOX 10 -------+ 27.4.4.1 basic_ios constructors [lib.basic.ios.sb.cons] basic_ios(basic_streambuf<charT,traits>* sb); Effects: Constructs an object of class basic_ios, assigning initial values to its member objects by calling init(sb). basic_ios(); Effects: Constructs an object of class basic_ios, +------- BEGIN BOX 11 -------+ TBS +------- END BOX 11 -------+ void init(basic_streambuf<charT,traits>* sb); +------- BEGIN BOX 12 -------+ TBS +------- END BOX 12 -------+ 27.4.4.2 Member functions [lib.basic.ios.members] 27.4.4.2.1 basic_ios::tie [lib.ios::tie] basic_ostream<charT,traits>* tie() const; Returns: An output sequence that is tied to (synchronized with) an input sequence controlled by the stream buffer. basic_ostream<charT,traits>* tie(basic_ostream<charT,traits>* tiestr); Postcondition: tiestr == tie(). Returns: The previous value of tie(). 27.4.4.2.2 basic_ios::rdbuf [lib.ios::rdbuf] basic_streambuf<charT,traits>* rdbuf() const; Returns: The streambuf associated with the stream. basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb); Postcondition: sb == rdbuf(). Effects: Calls clear(). +------- BEGIN BOX 13 -------+ Note: need to modify so as to describe the occurence of imbueing get loc()::codecvt into the argument stream buffer. +------- END BOX 13 -------+ Returns: The previous value of rdbuf(). 27.4.5 ios_base manipulators [lib.std.ios.manip] 27.4.5.1 fmtflags manipulators [lib.fmtflags.manip] ios_base& boolalpha(ios_base& str); Effects: Calls str.setf(ios_base::boolalpha). Returns: str.10) ios_base& noboolalpha(ios_base& str); Effects: Calls str.unsetf(ios_base::boolalpha). Returns: str. ios_base& showbase(ios_base& str); Effects: Calls str.setf(ios_base::showbase). Returns: str. ios_base& noshowbase(ios_base& str); Effects: Calls str.unsetf(ios_base::showbase). Returns: str. ios_base& showpoint(ios_base& str); Effects: Calls str.setf(ios_base::showpoint). Returns: str. ios_base& noshowpoint(ios_base& str); Effects: Calls str.unsetf(ios_base::showpoint). Returns: str. ios_base& showpos(ios_base& str); Effects: Calls str.setf(ios_base::showpos). Returns: str. ios_base& noshowpos(ios_base& str); Effects: Calls str.unsetf(ios_base::showpos). Returns: str. ios_base& skipws(ios_base& str); Effects: Calls str.setf(ios_base::skipws). Returns: str. ios_base& noskipws(ios_base& str); Effects: Calls str.unsetf(ios_base::skipws). Returns: str. ios_base& uppercase(ios_base& str); Effects: Calls str.setf(ios_base::uppercase). Returns: str. ios_base& nouppercase(ios_base& str); Effects: Calls str.unsetf(ios_base::uppercase). Returns: str. 27.4.5.2 adjustfield manipulators [lib.adjustfield.manip] ios_base& internal(ios_base& str); Effects: Calls str.setf(ios_base::internal,ios_base::adjustfield) Returns: str. ios_base& left(ios_base& str); Effects: Calls str.setf(ios_base::left,ios_base::adjustfield) Returns: str. ios_base& right(ios_base& str); Effects: Calls str.setf(ios_base::right,ios_base::adjustfield) Returns: str. 27.4.5.3 basefield manipulators [lib.basefield.manip] ios_base& dec(ios_base& str); Effects: Calls str.setf(ios_base::dec,ios_base::basefield) Returns: str. _________________________ 10) The function signature dec(ios_base&) can be called by the func ios_base& hex(ios_base& str); Effects: Calls str.setf(ios_base::hex,ios_base::basefield) Returns: str. ios_base& oct(ios_base& str); Effects: Calls str.setf(ios_base::oct,ios_base::basefield) Returns: str. 27.4.5.4 floatfield manipulators [lib.floatfield.manip] ios_base& fixed(ios_base& str); Effects: Calls str.setf(ios_base::fixed,ios_base::floatfield) Returns: str. ios_base& scientific(ios_base& str); Effects: Calls str.setf(ios_base::scientific,ios_base::floatfield) Returns: str. 27.5 Stream buffers [lib.stream.buffers] Header <streambuf> synopsis namespace std { template<class charT, class traits = ios_traits<charT> > class basic_streambuf; typedef basic_streambuf<char> streambuf; typedef basic_streambuf<wchar_t> wstreambuf; } 1 The header <streambuf> defines types that control input from and out put to character sequences. _________________________ tion signature basic_ostream& stream::operator<<(basic_ostream& (*)(basic_ostream&)) to permit expressions of the form cout << dec to change the format flags stored in cout. 27.5.1 Stream buffer requirements [lib.streambuf.reqts] 27.5.2 Template class [lib.streambuf] basic_streambuf<charT,traits> namespace std { template<class charT, class traits = ios_traits<charT> > class basic_streambuf { public: typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; // In order to simplify descriptions and as a convenience for programmers: typedef basic_ios<char> ios; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } public: virtual ~basic_streambuf(); pos_type pubseekoff(off_type off, basic_ios<charT,traits>::seekdir way, basic_ios<charT,traits>::openmode which = basic_ios<charT,traits>::in | basic_ios<charT,traits>::out); pos_type pubseekpos(pos_type sp, basic_ios<charT,traits>::openmode which = basic_ios<charT,traits>::in | basic_ios<charT,traits>::out); basic_streambuf<char_type,traits>* pubsetbuf(char_type* s, streamsize n); int in_avail(); int pubsync(); int_type sbumpc(); int_type sgetc(); int sgetn(char_type* s, streamsize n); int_type snextc(); int_type sputbackc(char_type c); int sungetc(); int sputc(int c); int_type sputn(const char_type* s, streamsize n); protected: basic_streambuf(); char_type* eback() const; char_type* gptr() const; char_type* egptr() const; void gbump(int n); void setg(char_type* gbeg, char_type* gnext, char_type* gend); char_type* pbase() const; char_type* pptr() const; char_type* epptr() const; void pbump(int n); void setp(char_type* pbeg, char_type* pend); virtual int_type overflow (int_type c = eof()); virtual int_type pbackfail(int_type c = eof()); virtual int showmany(); virtual int_type underflow(); virtual int_type uflow(); virtual streamsize xsgetn(char_type* s, streamsize n); virtual streamsize xsputn(const char_type* s, streamsize n); virtual pos_type seekoff(off_type off, basic_ios<charT,traits>::seekdir way, basic_ios<charT,traits>::openmode which = in | out); virtual pos_type seekpos(pos_type sp, basic_ios<charT,traits>::openmode which = in | out); virtual basic_streambuf<char_type,traits>* setbuf(char_type* s, streamsize n); virtual int sync(); }; } 1 The class template basic_streambuf<charT,traits> serves as an abstract base class for deriving various stream buffers whose objects each con trol two character sequences: --a character input sequence; --a character output sequence. 2 The class streambuf is an instantiation of the template class basic_streambuf specialized by the type char. 3 The class wstreambuf is an instantiation of the template class basic_streambuf specialized by the type wchar_t. 4 Stream buffers can impose various constraints on the sequences they control. Some constraints are: --The controlled input sequence can be not readable. --The controlled output sequence can be not writable. --The controlled sequences can be associated with the contents of other representations for character sequences, such as external files. --The controlled sequences can support operations directlyto or from associated sequences. --The controlled sequences can impose limitations on how the program can read characters from a sequence, write characters to a sequence, put characters back into an input sequence, or alter the stream position. 5 Each sequence is characterized by three pointers which, if non-null, all point into the same charT array object. The array object repre sents, at any moment, a (sub)sequence of characters from the sequence. Operations performed on a sequence alter the values stored in these pointers, perform reads and writes directly to or from associated sequences, and alter ``the stream position'' and conversion state as needed to maintain this subsequence relationship. The three pointers are: --the beginning pointer, or lowest element address in the array (called xbeg here); --the next pointer, or next element address that is a current candi date for reading or writing (called xnext here); --the end pointer, or first element address beyond the end of the array (called xend here). 6 The following semantic constraints shall always apply for any set of three pointers for a sequence, using the pointer names given immedi ately above: --If xnext is not a null pointer, then xbeg and xend shall also be non-null pointers into the same charT array, as described above. --If xnext is not a null pointer and xnext < xend for an output sequence, then a write position is available. In this case, *xnext shall be assignable as the next element to write (to put, or to store a character value, into the sequence). --If xnext is not a null pointer and xbeg < xnext for an input sequence, then a putback position is available. In this case, xnext[-1] shall have a defined value and is the next (preceding) element to store a character that is put back into the input sequence. --If xnext is not a null pointer and xnext < xend for an input sequence, then a read position is available. In this case, *xnext shall have a defined value and is the next element to read (to get, or to obtain a character value, from the sequence). 27.5.2.1 basic_streambuf constructors [lib.basic.streambuf.cons] basic_streambuf(); Effects: Constructs an object of class basic_streambuf<charT,traits> and initializes:11) --all its pointer member objects to null pointers, --the getloc() member object to the return value of global(). Notes: Once the getloc() member is initialized its locale-dependent behav ior does not change until the next imbueing of the locale. 27.5.2.2 Member functions [lib.streambuf.members] 27.5.2.2.1 [lib.streambuf::pubseekoff] basic_streambuf::pubseekoff pos_type pubseekoff(off_type off, basic_ios<charT,traits>::seekdir way, basic_ios<charT,traits>::openmode which = basic_ios<charT,traits>::in | basic_ios<charT,traits>::out); Returns: seekoff(off,way,which). 27.5.2.2.2 [lib.streambuf::pubseekpos] basic_streambuf::pubseekpos pos_type pubseekpos(pos_type sp, basic_ios<charT,traits>::openmode which = basic_ios<charT,traits>::in | basic_ios<charT,traits>::out); Returns: seekpos(sp,which). 27.5.2.2.3 basic_streambuf::pubsetbuf [lib.streambuf::pubsetbuf] basic_streambuf<char_type,traits>* setbuf(char_type* s, streamsize n); Returns: setbuf(s,n). _________________________ 11) The default constructor is protected for class basic_streambuf to assure that only objects for classes derived from this class may be constructed. 27.5.2.2.4 basic_streambuf::in_avail [lib.streambuf::in.avail] int in_avail(); Returns: If the input sequence read position is not available, returns show many(). Otherwise, returns egptr() - gptr(). 27.5.2.2.5 basic_streambuf::pubsync [lib.streambuf::pubsync] int pubsync(); Returns: sync(). 27.5.2.2.6 basic_streambuf::sbumpc [lib.streambuf::sbumpc] int_type sbumpc(); Returns: If the input sequence read position is not available, returns uflow(). Otherwise, returns char_type(*gptr()) and increments the next pointer for the input sequence. 27.5.2.2.7 basic_streambuf::sgetc [lib.streambuf::sgetc] int_type sgetc(); Returns: If the input sequence read position is not available, returns under flow(). Otherwise, returns char_type(*gptr()). 27.5.2.2.8 basic_streambuf::sgetn [lib.streambuf::sgetn] int sgetn(char_type* s, streamsize n); Returns: xsgetn(s,n). 27.5.2.2.9 basic_streambuf::snextc [lib.streambuf::snextc] int_type snextc(); Effects: Calls sbumpc() and, if that function returns eof(), returns eof(). Otherwise, returns sgetc(). Notes: Uses traits::eof(). 27.5.2.2.10 [lib.streambuf::sputbackc] basic_streambuf::sputbackc int_type sputbackc(char_type c); Returns: If the input sequence putback position is not available, or if c != gptr()[-1], returns pbackfail(c). Otherwise, decrements the next pointer for the input sequence and returns *gptr(). 27.5.2.2.11 basic_streambuf::sungetc [lib.streambuf::sungetc] int sungetc(); Returns: If the input sequence putback position is not available, returns pbackfail(). Otherwise, decrements the next pointer for the input sequence and returns *gptr(). 27.5.2.2.12 basic_streambuf::sputc [lib.streambuf::sputc] int sputc(int c); Returns If the output sequence write position is not available, returns overflow(c). Otherwise, stores c at the next pointer for the output sequence, increments the pointer, and returns *pptr(). 27.5.2.2.13 basic_streambuf::sputn [lib.streambuf::sputn] int_type sputn(const char_type* s, streamsize n); Returns: xsputn(s,n). 27.5.2.2.14 basic_streambuf::eback [lib.streambuf::eback] char_type* eback() const; Returns: The beginning pointer for the input sequence. 27.5.2.2.15 basic_streambuf::gptr [lib.streambuf::gptr] char_type* gptr() const; Returns: The next pointer for the input sequence. 27.5.2.2.16 basic_streambuf::egptr [lib.streambuf::egptr] char_type* egptr() const; Returns: The end pointer for the output sequence. 27.5.2.2.17 basic_streambuf::gbump [lib.streambuf::gbump] void gbump(int n); Effects: Advances the next pointer for the input sequence by n. 27.5.2.2.18 basic_streambuf::setg [lib.streambuf::setg] void setg(char_type* gbeg, char_type* gnext, char_type* gend); Postconditions: gbeg == eback(), gnext == gptr(), and gend == egptr(). 27.5.2.2.19 basic_streambuf::pbase [lib.streambuf::pbase] char_type* pbase() const; Returns: The beginning pointer for the output sequence. 27.5.2.2.20 basic_streambuf::pptr [lib.streambuf::pptr] char_type* pptr() const; Returns: The next pointer for the output sequence. 27.5.2.2.21 basic_streambuf::epptr [lib.streambuf::epptr] char_type* epptr() const; Returns: The end pointer for the output sequence. 27.5.2.2.22 basic_streambuf::pbump [lib.streambuf::pbump] void pbump(int n); Effects: Advances the next pointer for the output sequence by n. 27.5.2.2.23 basic_streambuf::setp [lib.streambuf::setp] void setp(char_type* pbeg, char_type* pend); Postconditions: pbeg == pbase(), pbeg == pptr(), and pend == epptr(). 27.5.2.2.24 basic_streambuf::overflow [lib.streambuf::overflow] virtual int_type overflow(int_type c = eof()); Effects: Consumes some initial subsequence of the characters of the pending sequence. The pending sequence is defined as the concatenation of a)if pbase() is NULL then the empty sequence otherwise, pptr() - pbase() characters beginning at pbase(). b)if c == eof() then the empty sequence otherwise, the sequence con sisting of c. Notes: The member functions sputc() and sputn() call this function in case that no room can be found in the put buffer enough to accomodate the argument character sequence. 1 Every overriding definition of this virtual function shall obey the following constraints: 1)The effect of consuming a character on the associated output sequence is specified12) 2)Let r be the number of characters in the pending sequence not con sumed. If r is non-zero then pbase() and pptr() must be set so that: pptr() - pbase() == r and the r characters starting at pbase() are the associated output stream. In case r is zero (all charac ters of the pending sequence have been consumed) then either pbase() is set to NULL, or pbase() and pptr() are both set to the same non- NULL value. 3)The function may fail if either appending some character to the associated output stream fails or if it is unable to establish pbase() and pptr() according to the above rules. Returns: eof() or throws an exception if the function fails. Otherwise, returns some value other than eof() to indicate success.13) _________________________ 12) That is, for each class derived from an instance of ba sic_streambuf in this clause, a specification of how consume a charac ter effects the associated output sequence is given. There is no re quirement on a program-defined class. 13) Typically, overflow returns c to indicate success. Default behavior: Returns eof(). 27.5.2.2.25 [lib.streambuf::pbackfail] basic_streambuf::pbackfail virtual int_type pbackfail(int c = eof()); 1 The public functions of basic_streambuf call this virtual only when gptr() is null, gptr()==eback(), or *gptr()!=c. Other calls shall also satisfy that constraint. 2 The pending sequence is defined as for underflow (in _lib.streambuf::underflow_) with the modifications that --If c==eof() then the input sequence is backed up one character before the pending sequence is determined. --If c!=eof() then c is prepended. Whether the input sequence is backed up or modified in any other way is unspecified. 3 On return, the constraints of gptr(), eback(), and pptr() are the same as for underflow (in _lib.streambuf::underflow_) Returns: eof() to indicate failure. Failure may occur because the input sequence could not be backed up, or if for some other reason the pointers could not be set consistent with the constraints. pback fail is called only when put back has really failed. Returns some value other than eof() to indicate success. Default behavior: Returns eof(). 27.5.2.2.26 [lib.streambuf::showmany] basic_streambuf::showmany14) virtual int showmany(); Returns: a count of the guaranteed number of characters that can be read from the input sequence before a call to uflow()or underflow() returns eof(). A positive return value of indicates that the next such call will not return eof().15) Default behavior: Returns zero. _________________________ 14) The morphemes of showmany are "es-how-manyS, not "show-many". 15) The next such call might fail by throwing an exception. The in tention is that the next call will return ``immediately.'' 27.5.2.2.27 [lib.streambuf::underflow] basic_streambuf::underflow virtual int_type underflow(); 1 The public members of basic_streambuf call this virtual only if gptr() is null or gptr() >= egptr() Returns: the first character of the pending sequence, if possible, without moving the input sequence position past it. If the pending sequence is null then the function fails. 2 The pending sequence of characters is defined as the concatenation of: a)If gptr() is non- NULL, then the egptr() - gptr() characters start ing at gptr(), otherwise the empty sequence. b)Some sequence (possibly empty) of characters read from the input sequence. 3 The result character is a)If the pending sequence is non-empty, the first character of the sequence. b)If the pending sequence empty then the next character that would be read from the input sequence. 4 The backup sequence is defined as the concatenation of: a)If eback() is null then empty, b)Otherwise the gptr() - eback() characters beginning at eback(). 5 The function sets up the gptr() and egptr() satisfying one of: a)If the pending sequence is non-empty, egptr() is non-null and egptr() - gptr() characters starting at gptr() are the characters in the pending sequence b)If the pending sequence is empty, either gptr() is null or gptr() and egptr() are set to the same non- NULL pointer. 6 If eback() and gptr() are non-null then the function is not con strained as to their contents, but the ``usual backup condition'' is that either: a)If the backup sequence contains at least gptr() - eback() charac ters, then the gptr() - eback() characters starting at eback() agree with the last gptr() - eback() characters of the backup sequence. b)Or the n characters starting at gptr() - n agree with the backup sequence (where n is the length of the backup sequence) Returns: eof() to indicate failure. Default behavior: Returns eof(). 27.5.2.2.28 basic_streambuf::uflow [lib.streambuf::uflow] virtual int_type uflow(); 1 The constraints are the same as for underflow (_lib.streambuf::underflow_) except that the result character is transfered from the pending sequence to the backup sequence, and the pending sequence may not be empty before the transfer. Default behavior: Calls underflow(eof()). If underflow returns eof(), returns eof(). Otherwise, does gbump(-1) and returns *gptr(). Returns: not_eof(c). 27.5.2.2.29 basic_streambuf::xsgetn [lib.streambuf::xsgetn] virtual streamsize xsgetn(char_type* s, streamsize n); Effects: Assigns up to n characters to successive elements of the array whose first element is designated by s. The characters assigned are read from the input sequence as if by repeated calls to sbumpc(). Assigning stops when either n characters have been assigned or a call to sbumpc() would return eof(). Returns: The number of characters assigned.16) 27.5.2.2.30 basic_streambuf::xsputn [lib.streambuf::xsputn] virtual streamsize xsputn(const char_type* s, streamsize n); 1 Writes up to n characters to the output sequence as if by repeated calls to sputc(c). The characters written are obtained from succes sive elements of the array whose first element is designated by s. Writing stops when either n characters have been written or a call to sputc(c) would return eof(). Returns: The number of characters written. _________________________ 16) Classes derived from basic_streambuf can provide more efficient ways to implement xsgetn and xsputn by overriding these definitions in the base class. 27.5.2.2.31 basic_streambuf::seekoff [lib.streambuf::seekoff] virtual pos_type seekoff(off_type off, ic_ios<charT,traits>::seekdir way, ic_ios<charT,traits>::openmode which = basic_ios<charT,traits>::in | basic_ios<charT,traits>::out); Effects: Alters the stream positions within one or more of the controlled sequences in a way that is defined separately for each class derived from basic_streambuf in this clause (_lib.stringbuf::seekoff_, _lib.filebuf::seekoff_). Default behavior: Returns an object of class pos_type that stores an invalid stream position (_lib.iostreams.definitions_). 27.5.2.2.32 basic_streambuf::seekpos [lib.streambuf::seekpos] virtual pos_type seekpos(pos_type sp, ic_ios<charT,traits>::openmode which = in | out); Effects: Alters the stream positions within one or more of the controlled sequences in a way that is defined separately for each class derived from basic_streambuf in this clause (_lib.stringbuf::seekpos_, _lib.filebuf::seekpos_). Default behavior: Returns an object of class pos_type that stores an invalid stream position. 27.5.2.2.33 basic_streambuf::setbuf [lib.streambuf::setbuf] virtual basic_streambuf* buf(char_type* s, streamsize n); Effects: Performs an operation that is defined separately for each class derived from basic_streambuf in this clause (_lib.stringbuf::setbuf_, _lib.filebuf::setbuf_). Default behavior: Returns this. 27.5.2.2.34 basic_streambuf::sync [lib.streambuf::sync] virtual int sync(); Effects: Synchronizes the controlled sequences with the arrays. That is, if pbase() is non-null the characters between pbase() and pptr() are written to the controlled sequence, and if gptr() is non-null, the characters between gptr() and egptr() are restored to the input sequence. The pointers may then be reset as appropriate. Returns: -1 on failure. What constitutes failure is determined by each derived class (_lib.filebuf::sync_). Default behavior: Returns zero. 27.6 Formatting and manipulators [lib.iostream.format] Header <istream> synopsis namespace std { template <class charT, class traits = ios_traits<charT> > class basic_istream; typedef basic_istream<char> istream; typedef basic_istream<wchar_t> wistream; template<class charT, class traits> basic_istream<charT,traits>& ws(basic_istream<charT,traits>& is); } Header <ostream> synopsis namespace std { template <class charT, class traits = ioc_traits<charT> > class basic_ostream; typedef basic_ostream<char> ostream; typedef basic_ostream<wchar_t> wostream; template<class charT, class traits> basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os); template<class charT, class traits> basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os); template<class charT, class traits> basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os); } Header <iomanip> synopsis #include <istream> #include <ostream> namespace std { typedef ? smanip; smanip resetiosflags(ios_base::fmtflags mask); smanip setiosflags (ios_base::fmtflags mask); smanip setbase(int base); smanip setfill(int c); smanip setprecision(int n); smanip setw(int n); } 1 The header <iomanip> defines three template classes and several related functions that use these template classes to provide extrac tors and inserters that alter information maintained by class ios_base and its derived classes. It also defines several instantiations of these template classes and functions. 27.6.1 Input streams [lib.input.streams] 1 The header <istream> defines a type and a function signature that con trol input from a stream buffer. 27.6.1.1 Template class basic_istream [lib.istream] namespace std { template <class charT, class traits = ios_traits<charT> > class basic_istream : virtual public basic_ios<charT,traits> { public: typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } private: // for abbreviation: typedef basic_istream<char_type,traits> istream_type; typedef basic_ios<charT,traits> ios_type; public: basic_istream(basic_streambuf<charT,traits>* sb); virtual ~basic_istream(); bool ipfx(bool noskipws = 0); void isfx(); istream_type& operator>>(istream_type& (*pf)(istream_type&)) istream_type& operator>>(ios_type& (*pf)(ios_type&)) istream_type& operator>>(char_type* s); istream_type& operator>>(char_type& c); istream_type& operator>>(bool& n); istream_type& operator>>(short& n); istream_type& operator>>(unsigned short& n); istream_type& operator>>(int& n); istream_type& operator>>(unsigned int& n); istream_type& operator>>(long& n); istream_type& operator>>(unsigned long& n); istream_type& operator>>(float& f); istream_type& operator>>(double& f); istream_type& operator>>(long double& f); istream_type& operator>>(void*& p); istream_type& operator>>(basic_streambuf<char_type,traits>& sb); int_type get(); istream_type& get(char_type* s, streamsize n, char_type delim = newline()); istream_type& get(char_type& c); istream_type& get(basic_streambuf<char_type,traits>& sb, char_type delim = newline()); istream_type& getline(char_type* s, streamsize n, char_type delim = newline()); istream_type& ignore(streamsize n = 1, int_type delim = eof()); istream_type& read(char_type* s, streamsize n); int readsome(char_type* s, int n); int peek(); istream_type& putback(char_type c); istream_type& unget(); streamsize gcount() const; int sync(); }; } 1 The class basic_istream defines a number of member function signatures that assist in reading and interpreting input from sequences con trolled by a stream buffer. 2 Two groups of member function signatures share common properties: the formatted input functions (or extractors) and the unformatted input functions. Both groups of input functions are described as if they obtain (or extract) input characters by calling sb.sbumpc() or sb.sgetc(). They may use other public members of istream except that they do not invoke any virtual members of sb except uflow(). 3 If sb.sbumpc() or sb.sgetc() returns eof(), then the input function, except as explicitly noted otherwise, completes its actions and does setstate(eofbit) before returning. 4 If one of these called functions throws an exception, then unless explicitly noted otherwise the input function calls setstate(badbit) and if badbit is on in sb.exception() rethrows the exception without completing its actions. 27.6.1.2 basic_istream constructors [lib.basic.istream.cons] basic_istream(basic_streambuf<charT,traits>* sb); Effects: Constructs an object of class basic_istream, assigning initial val ues to the base class by calling basic_ios::init(sb). Postcondition: gcount() == 0 virtual ~basic_istream(); Effects: Destroys an object of class basic_istream. Notes: Does not perform any operations of rdbuf(). 27.6.1.3 Member functions [lib.istream.members] 27.6.1.3.1 basic_istream::ipfx [lib.istream::ipfx] bool ipfx(bool noskipws = 0); Effects: If good() is true, prepares for formatted or unformatted input. First, if tie() is not a null pointer, the function calls tie()->flush() to synchronize the output sequence with any associ ated external C stream.17) If noskipws is zero and flags() & skipws is nonzero, the function extracts and discards each character as long as the next available input character c is a whitespace charac ter. Notes: The function basic_istream<charT,traits>::ipfx() uses the function bool traits::is_whitespace(charT, const locale*) in the traits structure to determine whether the next input character is whites pace or not. 1 To decide if the character c is a whitespace character, the function performs as if it executes the following code fragment: ctype<charT> ctype = getloc().use<ctype<charT> >(); if (traits::is_whitespace (c, ctype)!=0) // c is a whitespace character. Returns: If, after any preparation is completed, good() is true, returns true. Otherwise, it calls setstate(failbit) and returns false.18) 2 A typical implementation of the ipfx() function may be as follows: template <class charT, class traits = ios_traits<charT> > int basic_istream<charT,traits>::ipfx() { ... // skipping whitespace according to a constraint function, // is_whitespace intT c; typedef ctype<charT> ctype_type; ctype_type& ctype = getloc().use<ctype_type>(); while ((c = rdbuf()->snextc()) != eof()) { if (!traits::is_whitespace (c,ctype)==0) { rdbuf()->sputbackc (c); break; } } ... } _________________________ 17) The call tie()->flush() does not necessarily occur if the function can determine that no synchronization is necessary. 18) The functions ipfx(int) and isfx() can also perform additional im plementation-dependent operations. 3 In case we use ios_traits<char> or ios_traits<wchar_t>, the behavior of the constraint function traits::is_whitespace() is as if it invokes: ctype<charT>& ctype = getloc().use<ctype<charT> >(); ctype.is(ctype<charT>::SPACE, c); otherwise, the behavior of the function traits::is_whitespace() is unspecified. 4 Those who want to use locale-independent whitespace predicate can specify their definition of is_whitespace in their new ios_traits as follows: struct my_traits : public ios_traits<char> { typedef my_char_traits char_traits; }; struct my_char_traits : public ios_traits<char> { static bool is_whitespace (char c, const ctype<charT>& ctype) { ....(my own implementation)... } }; 27.6.1.3.2 basic_istream::isfx [lib.istream::isfx] void isfx(); Effects: +------- BEGIN BOX 14 -------+ TBS +------- END BOX 14 -------+ 27.6.1.3.3 basic_istream::sync [lib.istream::sync] int sync(); Effects: If rdbuf() is a null pointer, returns eof(). Otherwise, calls rdbuf()->pubsync() and, if that function returns eof(), calls set state(badbit) and returns eof(). Otherwise, returns zero. 27.6.1.4 Formatted input functions [lib.istream.formatted] 27.6.1.4.1 Common requirements [lib.istream.formatted.reqmts] 1 Each formatted input function begins execution by calling ipfx(). If that function returns true, the function endeavors to obtain the requested input. In any case, the formatted input function ends by calling isfx(), then returns *this 2 Some formatted input functions endeavor to obtain the requested input by parsing characters extracted from the input sequence, converting the result to a value of some scalar data type, and storing the con verted value in an object of that scalar data type. 3 The numeric conversion behaviors of the following extractors are locale-dependent. operator>>(short& val); operator>>(unsigned short& val); operator>>(int& val); operator>>(unsigned int& val); operator>>(long& val); operator>>(unsigned long& val); operator>>(float& val); operator>>(double& val); operator>>(long double& val); As in the case of the inserters, these extractors depend on the locale's num_get<> (_lib.locale.num.get_) object to perform parsing the input stream data. The conversion occurs as if it performed the following code fragment: HOLDTYPE tmp; num_get<charT>& fmt = loc.use< num_get<charT> >(); fmt.get (iter, *this, loc, tmp); if ((val = (TYPE)tmp) != tmp) // set fail bit... In the above fragment, loc stands for the private member of the basic_ios class, TYPE stands for the type of the argument of the extractor, and HOLDTYPE is as follows; --for short, int and long, HOLDTYPE is long; --for unsigned short, unsigned int and unsigned long, HOLDTYPE is unsigned long. --for float, double, HOLDTYPE is double. --for long double, HOLDTYPE is long double. 4 The first argument provides an object of the istream_iterator class which is an iterator pointed to an input stream. It bypasses istreams and uses streambufs directly. Class locale relies on this type as its interface to istream, since the flexibility it has been abstracted away from direct dependence on istream. 5 In case the converting result is a value of either an integral type ( short, unsigned short, int, unsigned int, long, unsigned long) or a float type ( float, double, long double), performing to parse and con vert the result depend on the imbued locale object. So the behavior of the above type extractors are locale-dependent. The imbued locale object uses an istreambuf_iterator to access the input character sequence. 6 The behavior of such functions is described in terms of the conversion specification for an equivalent call to the function fscanf()19) _________________________ 19) The signature fscanf(FILE*, const char*, ...) is declared in operating with the global locale set to getloc(), with the following alterations: --The formatted input function extracts characters from a stream buffer, rather than reading them from an input file.20) --If flags() & skipws is zero, the function does not skip any leading white space. In that case, if the next input character is white space, the scan fails. --If the converted data value cannot be represented as a value of the specified scalar data type, a scan failure occurs. +------- BEGIN BOX 15 -------+ Can the current num_put/num_get facet handle basefield specification? Needs more discussion. +------- END BOX 15 -------+ 7 If the scan fails for any reason, the formatted input function calls setstate(failbit). 8 For conversion to an integral type other than a character type, the function determines the integral conversion specifier as indicated in Table 9: Table 9--Integer conversions +------------------------------------------------+ | State stdio equivalent | +------------------------------------------------+ |(flags() & basefield) == oct %o | +------------------------------------------------+ |(flags() & basefield) == hex %x | |(flags() & uppercase) != 0 %X | +------------------------------------------------+ |(flags() & basefield) == 0 %i | +------------------------------------------------+ |Otherwise, | +------------------------------------------------+ |signed integral type %d | +------------------------------------------------+ |unsigned integral type %u | +------------------------------------------------+ +------- BEGIN BOX 16 -------+ _________________________ <cstdio> (_lib.c.files_) 20) The stream buffer can, of course, be associated with an input file, but it need not be. Is this table clear with regards to %x vs. %X? +------- END BOX 16 -------+ 27.6.1.4.2 basic_istream::operator>> [lib.istream::extractors] istream_type& operator>>(istream_type& (*pf)(istream_type&)) Returns: pf(*this).21) istream_type& operator>>(ios_type& (*pf)(ios_type&)) Effects: Calls pf(*this), then returns *this.22) istream_type& operator>>(char_type* s); Effects: Extracts characters and stores them into successive locations of an array whose first element is designated by s.23) If width() is greater than zero, the maximum number of characters stored n is width(); otherwise it is numeric_limits<int>::max() (_lib.limits_). 1 Characters are extracted and stored until any of the following occurs: --n - 1 characters are stored; --end-of-file occurs on the input sequence; --traits::is_whitespace(c,ctype) is nonzero for the next available input character c. In the above code fragment, the argument ctype is acquired by getloc().use<ctype<charT> >(). 2 If the function stores no characters, it calls setstate(failbit). In any case, it then stores a null character into the next successive location of the array and calls width(0). Returns: *this. istream_type& operator>>(char_type& c); Effects: Extracts a character, if one is available, and stores it in c. Oth erwise, the function calls setstate(failbit). _________________________ 21) See, for example, the function signature ws(basic_istream&) (_lib.basic.istream.manip_). 22) See, for example, the function signature dec(basic_ios<charT,traits>&) (_lib.basefiled.manip_). 23) Note that this function is not overloaded on types signed char and unsigned char. Returns: *this. istream_type& operator>>(bool& n); Effects: Converts a signed short integer, if one is available, and stores it in x. Returns: *this. Notes: Behaves as if: if (flags() & ios::boolalpha) { getloc().extract(*this, n); } else { int x; *this >> x; if (x == 0) n = false; else if (x == 1) n = true; else ; // indicate failure } return *this; 3 Locale extraction ( getloc().extract()) of the string is something like: istream i; string bool_false = ...; // locale dependent string bool_true = ...; string s; i >> s; if (s == bool_false) n = false; else if (s == bool_true) n = true; else ; // indicate failure 4 The strings for the default locale are false and true. istream_type& operator>>(short& n); Effects: Converts a signed short integer, if one is available, and stores it in n. Returns: *this. istream_type& operator>>(unsigned short& n); Effects: Converts an unsigned short integer, if one is available, and stores it in n. Returns: *this. istream_type& operator>>(int& n); Effects: Converts a signed integer, if one is available, and stores it in n. Returns: *this. istream_type& operator>>(unsigned int& n); Effects: Converts an unsigned integer, if one is available, and stores it in n. Returns: *this. istream_type& operator>>(long& n); Effects: Converts a signed long integer, if one is available, and stores it in n. Returns: *this. istream_type& operator>>(unsigned long& n); Effects: Converts an unsigned long integer, if one is available, and stores it in n. Returns: *this. istream_type& operator>>(float& f); Effects: Converts a float, if one is available, and stores it in f. Returns: *this. istream_type& operator>>(double& f); Effects: Converts a double, if one is available, and stores it in f. Returns: *this. istream_type& operator>>(long double& f); Effects: Converts a long double, if one is available, and stores it in f. Returns: *this. istream_type& operator>>(void*& p); Effects: Converts a pointer to void, if one is available, and stores it in p. Returns: *this. istream_type& operator>>(basic_streambuf<charT,traits>& sb); Effects: Extracts characters from *this and inserts them in the output sequence controlled by rdbuf(). Characters are extracted and inserted until any of the following occurs: --end-of-file occurs on the input sequence; --inserting in the output sequence fails (in which case the character to be inserted is not extracted); --an exception occurs (in which case the exception is caught). set state(badbit) is not called 5 If the function inserts no characters, it calls setstate(failbit). If failure was due to catching an exception thrown while extracting char acters from rdbuf() and failbit is on in exceptions() (_lib.ios::exceptions_), then the caught exception is rethrown. Returns: *this. 27.6.1.5 Unformatted input functions [lib.istream.unformatted] 1 Each unformatted input function begins execution by calling ipfx(1). If that function returns nonzero, the function endeavors to extract the requested input. It also counts the number of characters extracted. In any case, the unformatted input function ends by stor ing the count in a member object and calling isfx(), then returning the value specified for the unformatted input function. 27.6.1.5.1 basic_istream::get [lib.istream::get] int get(); Effects: Extracts a character c, if one is available. The function then returns (unsigned char)c. Otherwise, the function calls set state(failbit) and then returns eof(). istream_type& get(char_type* s, streamsize n, char_type delim = newline()); Effects: Extracts characters and stores them into successive locations of an array whose first element is designated by s.24) Characters are extracted and stored until any of the following occurs: --n - 1 characters are stored; --end-of-file occurs on the input sequence (in which case the function calls setstate(eofbit)); --c == delim for the next available input character c (in which case c is not extracted). 1 If the function stores no characters, it calls setstate(failbit). In any case, it then stores a null character into the next successive location of the array. Returns: *this. istream_type& get(char_type& c); Effects: Extracts a character, if one is available, and assigns it to c.25) Otherwise, the function calls setstate(failbit). Returns: *this. istream_type& get(basic_streambuf<char_type,traits>& sb, char_type delim = newline()); Effects: Extracts characters and inserts them in the output sequence con trolled by rdbuf(). Characters are extracted and inserted until any of the following occurs: --end-of-file occurs on the input sequence; --inserting in the output sequence fails (in which case the character to be inserted is not extracted); --c == delim for the next available input character c (in which case c is not extracted); --an exception occurs (in which case, the exception is caught but not _________________________ 24) Note that this function is not overloaded on types signed char and unsigned char. 25) Note that this function is not overloaded on types signed charand unsigned char. rethrown). 2 If the function inserts no characters, it calls setstate(failbit). Returns: *this. 27.6.1.5.2 basic_istream::getline [lib.istream::getline] istream_type& getline(char_type* s, streamsize n, char_type delim = newline()); Effects: Extracts characters and stores them into successive locations of an array whose first element is designated by s.26) Characters are extracted and stored until one of the following occurs: 1)end-of-file occurs on the input sequence (in which case the function calls setstate(eofbit)); 2)c == delim for the next available input character c (in which case the input character is extracted but not stored);27) 3)n - 1 characters are stored (in which case the function calls set state(failbit)). 1 These conditions are tested in the order shown.28) 2 If the function extracts no characters, it calls setstate(failbit).29) 3 In any case, it then stores a null character into the next successive location of the array. Returns: *this. 4 Example: _________________________ 26) Note that this function is not overloaded on types signed char and unsigned char. 27) Since the final input character is ``extracted,'' it is counted in the gcount(), even though it is not stored. 28) This allows an input line which exactly fills the buffer, without setting failbit. This is different behavior than the historical AT&T implementation. 29) This implies an empty input line will not cause failbit to be set. #include <iostream> using namespace std; const int line_buffer_size = 100; int main() { char buffer[line_buffer_size]; int line_number = 0; while (cin.getline(buffer, line_buffer_size) || cin.gcount()) { int count = cin.gcount(); if (cin.eof()) cout << "Partial final line"; // cin.fail() is false else if (cin.fail()) { cout << "Partial long line"; cin.clear(cin.rdstate() & ~ios::failbit); } else { count--; // Don't include '\n' in count cout << "Line " << ++line_number; } cout << " (" << count << " chars): " << buffer << endl; } } 27.6.1.5.3 basic_istream::ignore [lib.istream::ignore] istream_type& ignore(int n = 1, int_type delim = eof()); Effects: Extracts characters and discards them. Characters are extracted until any of the following occurs: --if n != numeric_limits<int>::max() (_lib.limits_), n characters are extracted --end-of-file occurs on the input sequence (in which case the function calls setstate(eofbit)); --c == delim for the next available input character c (in which case c is extracted). 1 The last condition will never occur if delim == eof(). Returns: *this. 27.6.1.5.4 basic_istream::read [lib.istream::read] istream_type& read(char_type* s, streamsize n); Effects: Extracts characters and stores them into successive locations of an array whose first element is designated by s.30) Characters are _________________________ 30) Note that this function is not overloaded on types signed char and unsigned char. extracted and stored until either of the following occurs: --n characters are stored; --end-of-file occurs on the input sequence (in which case the function calls setstate(failbit)). Returns: *this. 27.6.1.5.5 basic_istream::readsome [lib.istream::readsome] int readsome(char_type* s, int n); Effects: Extracts characters and stores them into successive locations of an array whose first element is designated by s. The function first determines navail, the value returned by calling in_avail(). If navail is 1, the function calls setstate(eofbit) and returns zero. 1 Otherwise, the function determines the number of characters to extract m as the smaller of n and navail, and returns read(s, m). 27.6.1.5.6 basic_istream::peek [lib.istream::peek] int peek(); Returns: eof() if good() is false. Otherwise, returns rdbuf()->sgetc(). 27.6.1.5.7 basic_istream::putback [lib.istream::putback] istream_type& putback(char_type c); Effects: Calls rdbuf->sputbackc(c). If that function returns eof(), calls setstate(badbit). Returns: *this. 27.6.1.5.8 basic_istream::unget [lib.istream::unget] istream_type& unget(); Effects: Calls rdbuf->sungetc(). If that function returns eof(), calls set state(badbit). Returns: *this. 27.6.1.5.9 basic_istream::gcount [lib.istream::gcount] streamsize gcount() const; Returns: The number of characters extracted by the last unformatted input member function called for the object. 27.6.1.6 Standard basic_istream [lib.basic.istream.manip] manipulators namespace std { template<class charT, class traits> basic_istream<charT,traits>& ws(basic_istream<charT,traits>& is); } Effects: Saves a copy of is.fmtflags, then clears is .skipws in is .flags(). Then calls is .ipfx() and is .isfx(), and restores is .flags() to its saved value.31) Returns: is. 27.6.2 Output streams [lib.output.streams] 1 The header <ostream> defines a type and several function signatures that control output to a stream buffer. 27.6.2.1 Template class basic_ostream [lib.ostream] namespace std { template <class charT, class traits = ioc_traits<charT> > class basic_ostream : virtual public basic_ios<charT,traits> { public: typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } private: typedef basic_ostream<charT,traits> ostream_type; public: basic_ostream(basic_streambuf<char_type,traits>* sb); virtual ~basic_ostream(); bool opfx(); void osfx(); _________________________ 31) The effect of cin >> ws is to skip any white space in the input sequence controlled by cin. ostream_type& operator<<(ostream_type& (*pf)(ostream_type&)); ostream_type& operator<<(ios_type& (*pf)(ios_type&)); ostream_type& operator<<(const char_type* s); ostream_type& operator<<(char_type c); ostream_type& operator<<(bool n); ostream_type& operator<<(short n); ostream_type& operator<<(unsigned short n); ostream_type& operator<<(int n); ostream_type& operator<<(unsigned int n); ostream_type& operator<<(long n); ostream_type& operator<<(unsigned long n); ostream_type& operator<<(float f); ostream_type& operator<<(double f); ostream_type& operator<<(long double f); ostream_type& operator<<(void* p); ostream_type& operator<<(basic_streambuf<char_type,traits>& sb); int put(char_type c); ostream_type& write(const char_type* s, streamsize n); ostream_type& flush(); }; } 1 The class basic_ostream defines a number of member function signatures that assist in formatting and writing output to output sequences con trolled by a stream buffer. 2 Two groups of member function signatures share common properties: the formatted output functions (or inserters) and the unformatted output functions. Both groups of output functions generate (or insert) out put characters by actions equivalent to calling rdbuf().sputc(int). They may use other public members of basic_ostream except that they do not invoke any tuals members of rdbuf() except overflow. If the called function throws an exception, the output function calls set state(badbit) and if badbit is on in exceptions() rethrows the excep tion. 27.6.2.2 basic_ostream constructors [lib.basic.ostream.sb.cons] basic_ostream(basic_streambuf<charT,traits>* sb); Effects: Constructs an object of class basic_ostream, assigning initial val ues to the base class by calling basic_ios<charT,traits>::init(sb). virtual ~basic_ostream(); Effects: Destroys an object of class basic_ostream. Notes: Does not perform any operations on rdbuf(). 27.6.2.3 Member functions [lib.basic.ostream.members] 27.6.2.3.1 basic_ostream::opfx [lib.ostream::opfx] bool opfx(); 1 If good() is nonzero, prepares for formatted or unformatted output. If tie() is not a null pointer, calls tie()->flush().32) +------- BEGIN BOX 17 -------+ Note: Need to append the locale dependency on appropriate extractors. +------- END BOX 17 -------+ Returns: good().33) 27.6.2.3.2 basic_ostream::osfx [lib.ostream::osfx] void osfx(); 1 If flags() & unitbuf is nonzero, calls flush(). 27.6.2.3.3 basic_ostream::flush [lib.ostream::flush] basic_ostream& flush(); 1 If rdbuf() is not a null pointer, calls rdbuf()->pubsync(). If that function returns eof(), calls setstate(badbit). Returns: *this. 27.6.2.4 Formatted output functions [lib.ostream.formatted] 27.6.2.4.1 Common requirements [lib.ostream.formatted.reqmts] 1 Each formatted output function begins execution by calling opfx(). If that function returns nonzero, the function endeavors to generate the requested output. In any case, the formatted output function ends by calling osfx(), then returning the value specified for the formatted output function. 2 The numeric conversion behaviors of the following inserters are locale-dependent: _________________________ 32) The call tie()->flush() does not necessarily occur if the function can determine that no synchronization is necessary. 33) The function signatures opfx() and osfx() can also perform addi tional implementation-dependent operations. operator<<(short val); operator<<(unsigned short val); operator<<(int val); operator<<(unsigned int val); operator<<(long val); operator<<(unsigned long val); operator<<(float val); operator<<(double val); operator<<(long double val); 3 The classes num_get<> and num_put<> handle locale-dependent numeric formatting and parsing. The above inserter functions refers the imbued locale value to utilize these numeric formatting functionality. The formatting conversion occurs as if it performed the following code fragment: num_put<charT>& fmt = loc.use< num_put<charT> >(); fmt.put (ostreambuf_iterator(*this), *this, loc, val); In the above fragment, loc stands for the private member of the basic_ios class which maintains the imbued localeobject. The first argument provides an object of the ostreambuf_iterator class which is an iterator for ostream class. It bypasses ostreams and uses stream bufs directly. Class locale relies on these types as its interface to iostreams, since for flexibility it has been abstracted away from direct dependence on ostream. 4 Some formatted output functions endeavor to generate the requested output by converting a value from some scalar or NTBS type to text form and inserting the converted text in the output sequence. +------- BEGIN BOX 18 -------+ Needs work: NTBS. +------- END BOX 18 -------+ The behavior of such functions is described in terms of the conversion specification for an equivalent call to the function fprintf,34) oper ating with the global locale set to getloc(), with the following alterations: --The formatted output function inserts characters in a stream buffer, rather than writing them to an output file.35) --The formatted output function uses the fill character returned by fill() as the padding character (rather than the space character for left or right padding, or 0 for internal padding). 5 If the operation fails for any reason, the formatted output function calls setstate(badbit). _________________________ 34) The signature fprintf(FILE*, const char_type*, ...) is declared in <cstdio> (_lib.c.files_). 35) The stream buffer can, of course, be associated with an output file, but it need not be. 6 For conversion from an integral type other than a character type, the function determines the integral conversion specifier as indicated in Table 10: Table 10--Integer conversions +------------------------------------------------+ | State stdio equivalent | +------------------------------------------------+ |(flags() & basefield) == oct %o | +------------------------------------------------+ |(flags() & basefield) == hex %x | |(flags() & uppercase) != 0 %X | +------------------------------------------------+ |Otherwise, | +------------------------------------------------+ |signed integral type %d | +------------------------------------------------+ |unsigned integral type %u | +------------------------------------------------+ +------- BEGIN BOX 19 -------+ Is this table clear with regards to %x vs. %X? +------- END BOX 19 -------+ 7 For conversion from a floating-point type, the function determines the floating-point conversion specifier as indicated in Table 11: +------- BEGIN BOX 20 -------+ Can the current num_put/num_get facet handle basefield specification? Needs more discussion. +------- END BOX 20 -------+ Table 11--Floating-point conversions +--------------------------------------------------------+ | State stdio equivalent | +--------------------------------------------------------+ |(flags() & floatfield) == fixed %f | +--------------------------------------------------------+ |(flags() & floatfield) == scientific %e | |(flags() & uppercase) != 0 %E | +--------------------------------------------------------+ |Otherwise, | +--------------------------------------------------------+ | %g | |(flags() & uppercase) != 0 %G | +--------------------------------------------------------+ +------- BEGIN BOX 21 -------+ Is this table clear with regards to %e vs. %E? +------- END BOX 21 -------+ 8 The conversion specifier has the following additional qualifiers prepended as indicated in Table 12: Table 12--Floating-point conversions +----------------------------------------------------------------------+ | Type(s) State stdio equivalent | +----------------------------------------------------------------------+ |an integral type oth (flags() & showpos) != 0 + | |er than a character (flags() & showbase) != 0 # | |type | +----------------------------------------------------------------------+ |a floating-point type (flags() & showpos) != 0 + | | (flags() & showpoint) != 0 # | +----------------------------------------------------------------------+ --For any conversion, if width() is nonzero, then a field width is specified in the conversion specification. The value is width(). --For conversion from a floating-point type, if flags() & fixed is nonzero or if precision() is greater than zero, then a precision is specified in the conversion specification. The value is preci sion(). 9 Moreover, for any conversion, padding with the fill character returned by fill() behaves as follows: --If (flags() & adjustfield) == right, no flag is prepended to the conversion specification, indicating right justification (any padding occurs before the converted text). A fill character occurs wherever fprintf generates a space character as padding. --If (flags() & adjustfield) == internal, the flag 0 is prepended to the conversion specification, indicating internal justification (any padding occurs within the converted text). A fill character occurs wherever fprintf generates a 0 as padding.36) 10Otherwise, the flag - is prepended to the conversion specification, indicating left justification (any padding occurs after the converted text). A fill character occurs wherever fprintf() would generate a space character as padding. 11Unless explicitly stated otherwise for a particular inserter, each formatted output function calls width(0) after determining the field width. 27.6.2.4.2 basic_ostream::operator<< [lib.ostream.inserters] ostream_type& operator<<(ostream_type& (*pf)(ostream_type&)) Returns: pf(*this).37) ostream_type& operator<<(ios_type& (*pf)(ios_type&)) Effects: Calls (*(basic_ios<charT,traits>*)pf)(*this). Returns: *this.38) ostream_type& operator<<(const char_type* s); Effects: Converts the NTBS s with the conversion specifier s. Returns: *this. ostream_type& operator<<(char_type c); Effects: Converts the char_type c with the conversion specifier c and a field width of zero.39) The stored field width ( _________________________ 36) The conversion specification #o generates a leading 0 which is not a padding character. 37) See, for example, the function signature endl(basic_ostream&) (_lib.basic.ostream.manip_) . 38) See, for example, the function signature dec(ios_base&) (_lib.basefield.manip_). 39) Note that this function is not overloaded on types signed char and basic_ios<charT,traits>::width()) is not set to zero. Returns: *this. ostream_type& operator<<(bool n); 1 Behaves as if: { if (flags() & ios::boolalpha) { getloc().insert(*this, n); } else { *this << int(n); } } Returns: *this. ostream_type& operator<<(short n); Effects: Converts the signed short integer n with the integral conversion specifier preceded by h. Returns: *this. ostream_type& operator<<(unsigned short n); Effects: Converts the unsigned short integer n with the integral conversion specifier preceded by h. Returns: *this. ostream_type& operator<<(int n); Effects: Converts the signed integer n with the integral conversion speci fier. Returns: *this. ostream_type& operator<<(unsigned int n); Effects: Converts the unsigned integer n with the integral conversion speci fier. Returns: *this. _________________________ unsigned char. ostream_type& operator<<(long n); Effects: Converts the signed long integer n with the integral conversion specifier preceded by l. Returns: *this. ostream_type& operator<<(unsigned long n); Effects: Converts the unsigned long integer n with the integral conversion specifier preceded by l. Returns: *this. ostream_type& operator<<(float f); Effects: Converts the float f with the floating-point conversion specifier. Returns: *this. ostream_type& operator<<(double f); Effects: Converts the double f with the floating-point conversion specifier. Returns: *this. ostream_type& operator<<(long double f); Effects: Converts the long double f with the floating-point conversion speci fier preceded by L. Returns: *this. ostream_type& operator<<(void* p); Effects: Converts the pointer to void p with the conversion specifier p. Returns: *this. ostream_type& operator<<(basic_streambuf<charT,traits>& sb); 2 Gets characters from rdbuf() and inserts them in *this. Characters are read from rdbuf() and inserted until any of the following occurs: --end-of-file occurs on the input sequence; --inserting in the output sequence fails (in which case the character to be inserted is not extracted); LI an exception occurs while get ting a character from rdbuf() (in which case, the exception is rethrown). 3 If the function inserts no characters or if it stopped because an exception was thrown while extracting a character, it calls set state(failbit). If an exception was thrown while extracting a charac ter and failbit is on in exceptions() the caught exception is rethrown. Returns: *this. 27.6.2.5 Unformatted output functions [lib.ostream.unformatted] 1 Each unformatted output function begins execution by calling opfx(). If that function returns nonzero, the function endeavors to generate the requested output. In any case, the unformatted output function ends by calling osfx(), then returning the value specified for the unformatted output function. 27.6.2.5.1 basic_ostream::put [lib.ostream::put] int put(char_type c); Effects: Inserts the character c, if possible.40) Then returns (unsigned char)c. 1 Otherwise, calls setstate(badbit) and returns eof(). 27.6.2.5.2 basic_ostream::write [lib.ostream::write] basic_ostream& write(const char_type* s, streamsize n); Effects: Obtains characters to insert from successive locations of an array whose first element is designated by s.41) Characters are inserted until either of the following occurs: --n characters are inserted; --inserting in the output sequence fails (in which case the function calls setstate(badbit)). Returns: *this. _________________________ 40) Note that this function is not overloaded on types signed char and unsigned char. 41) Note that this function is not overloaded on types signed char and unsigned char. 27.6.2.6 Standard basic_ostream [lib.basic.ostream.manip] manipulators 27.6.2.6.1 endl [lib.endl] namespace std { template<class charT, class traits> basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os); } Effects: Calls os .put(traits::newline()), then os .flush(). Returns: os.42) 27.6.2.6.2 ends [lib.ends] namespce std { template<class charT, class traits> basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os); } Effects: Calls os .put(traits::eos()). Returns: os.43) 27.6.2.6.3 flush [lib.flush] namespace std { template<class charT, class traits> basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os); } Effects: Calls os .flush(). Returns: os. 27.6.3 Standard manipulators [lib.std.manip] _________________________ 42) The effect of executing cout << endl is to insert a newline char acter in the output sequence controlled by cout, then synchronize it with any external file with which it might be associated. 43) The effect of executing ostr << ends is to insert a null charac ter in the output sequence controlled by ostr. If ostr is an object of class basic_strstreambuf, the null character can terminate an NTBS constructed in an array object. 27.6.3.1 Type smanip [lib.smanip] 1 The type smanip is an implementation-defined function type (_dcl.fct_) returned by the standard manipulators. 27.6.3.2 resetiosflags [lib.resetiosflags] smanip resetiosflags(ios_base::fmtflags mask); Returns: smanip(f, mask), where f can be defined as:44) template<class charT, class traits> ios_base& f(ios_base& str, ios_base::fmtflags mask) { // reset specified flags str.setf(ios_base::fmtflags(0), mask); return str; } 27.6.3.3 setiosflags [lib.setiosflags] smanip setiosflags(ios_base::fmtflags mask); Returns: smanip(f,mask), where f can be defined as: ios_base& f(ios_base& str, ios_base::fmtflags mask) { // set specified flags str.setf(mask); return str; } 27.6.3.4 setbase [lib.setbase] smanip setbase(int base); Returns: smanip(f, base), where f can be defined as: _________________________ 44) The expression cin >> resetiosflags(ios_base::skipws) clears ios_base::skipws in the format flags stored in the istream object cin (the same as cin >> noskipws), and the expression cout << resetios flags(ios_base::showbase) clears ios_base::showbase in the format flags stored in the ostream object cout (the same as cout << noshow base). ios_base& f(ios_base& str, int base) { // set basefield str.setf(n == 8 ? ios_base::oct : n == 10 ? ios_base::dec : n == 16 ? ios_base::hex : ios_base::fmtflags(0), ios_base::basefield); return str; } 27.6.3.5 setfill [lib.setfill] smanip setfill(int c); Returns: smanip(f, c), where f can be defined as: ios_base& f(ios_base& str, int c) { // set fill character str.fill(c); return str; } 27.6.3.6 setprecision [lib.setprecision] smanip setprecision(int n); Returns: smanip(f, n), where f can be defined as: ios_base& f(ios_base& str, int n) { // set precision str.precision(n); return str; } 27.6.3.7 setw [lib.setw] smanip setw(int n); Returns: smanip(f, n), where f can be defined as: ios_base& f(ios_base& str, int n) { // set width str.width(n); return str; } 27.7 String-based streams [lib.string.streams] Header <sstream> synopsis #include <streambuf> #include <istream> #include <ostream> namespace std { template <class charT, class traits = int_charT_traits<charT> > class basic_stringbuf; typedef basic_stringbuf<char> stringbuf; typedef basic_stringbuf<wchar_t> wstringbuf; template <class charT, class traits = ios_traits<charT> > class basic_istringstream; typedef basic_istringstream<char> istringstream; typedef basic_istringstream<wchar_t> wistringstream; template <class charT, class traits = ios_traits<charT> > class basic_ostringstream; typedef basic_ostringstream<char> ostringstream; typedef basic_ostringstream<wchar_t> wostringstream; } Table 12--Header <cstdlib> synopsis +---------------------+ |Type Name(s) | +---------------------+ |Functions: | | atoi strtod | | atol strtol | +---------------------+ 1 SEE ALSO: ISO C subclause 7.10.1. 2 The header <sstream> defines three types that associate stream buffers with objects of class string, as described in clause _lib.string_. 27.7.1 Template class basic_stringbuf [lib.stringbuf] namespace std { template <class charT, class traits = int_charT_traits<charT> > class basic_stringbuf : public basic_streambuf<charT,traits> { public: typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } public: basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out); basic_stringbuf(const basic_string<char_type>& str, ios_base::openmode which = ios_base::in | ios_base::out); virtual ~basic_stringbuf(); basic_string<char_type> str() const; void str(const basic_string<char_type>& s); protected: // virtual int_type overflow (int_type c = eof()); inherited // virtual int_type pbackfail(int_type c = eof()); inherited // virtual int showmany(); inherited // virtual int_type underflow(); inherited // virtual int_type uflow(); inherited // virtual streamsize xsgetn(char_type* s, streamsize n); inherited // virtual streamsize xsputn(const char_type* s, streamsize n); inherited // virtual pos_type seekoff(off_type off, // ios_base::seekdir way, // ios_base::openmode which // = ios_base::in // | ios_base::out); inherited // virtual pos_type seekpos(pos_type sp, // ios_base::openmode which // = ios_base::in // | ios_base::out); inherited // virtual basic_streambuf<char_type,traits>* // setbuf(char_type* s, streamsize n); inherited // virtual int sync(); inherited private: // ios_base::openmode mode; exposition only }; } +------- BEGIN BOX 22 -------+ Note: same charT type string can be fed. +------- END BOX 22 -------+ 1 The class basic_stringbuf is derived from basic_streambuf to associate possibly the input sequence and possibly the output sequence with a sequence of arbitrary characters. The sequence can be initialized from, or made available as, an object of class basic_string. +------- BEGIN BOX 23 -------+ For the sake of exposition, the maintained data is presented here as: --ios_base::openmode mode, has in set if the input sequence can be read, and out set if the output sequence can be written. 2 For the sake of exposition, the stored character sequence is described here as an array object. +------- END BOX 23 -------+ +------- BEGIN BOX 24 -------+ The descriptions of the virtuals in this class need to be brought into agreement with the new descriptions of the generic protocols. As part of that we have // // string data ; exposition only +------- END BOX 24 -------+ 27.7.1.1 basic_stringbuf [lib.basic.stringbuf.cons] constructors basic_stringbuf(ios_base::openmode which = ios_base::in ios_base::out); Effects: Constructs an object of class basic_stringbuf, initializing the base class with basic_streambuf(), and initializing mode with which. The function allocates no array object. basic_stringbuf(const basic_string<char_type>& str, ios_base::openmode which = ios_base::in ios_base::out); Effects: Constructs an object of class basic_stringbuf, initializing the base class with basic_streambuf(), and initializing mode with which. Notes: If str .length() is nonzero, the function allocates an array object x whose length n is str .length() and whose elements x[I] are ini tialized to str[I]. If which & basic_ios::in is nonzero, the func tion executes: setg(x,x,x+n); If which & basic_ios::out is nonzero, the function executes: setp(x,x+n); 27.7.1.2 Member functions [lib.stringbuf.members] 27.7.1.2.1 basic_stringbuf::str [lib.stringbuf::str] basic_string<char_type> str() const; Returns: The return value of this function are indicated in Table 13: Table 13--str return values +------------------------------------------------------------------------+ | Condition Return Value | +------------------------------------------------------------------------+ (mode & basic_ios::in) basic_string<char_type>(eback(),egptr() - eback())| != 0 and (gptr() != 0) | +------------------------------------------------------------------------+ (mode & basic_ios::out)basic_string<char_type>(pbase(),pptr - pbase()) | != 0 and (pptr() != 0 | +------------------------------------------------------------------------+ |Otherwise basic_string<char_type>() | +------------------------------------------------------------------------+ void str(const basic_string<char_type>& s); Effects: If s.length() is zero, executes: setg(0, 0, 0); setp(0, 0); and frees storage for any associated array object. Otherwise, the function allocates an array object x whose length n is str.length() and whose elements x[I] are initialized to str[I]. If which & ios_base::in != 0, the function executes: setg(x,x,x+n); If which & ios_base::out != 0, the function executes: setp(x,x+n); 27.7.1.2.2 basic_stringbuf::overflow [lib.stringbuf::overflow] // virtual int_type overflow(int_type c = eof()); inherited Effects: Appends the character designated by c to the output sequence, if possible, in one of two ways: --If c != eof() and if either the output sequence has a write position available or the function makes a write position available (as described below), the function calls sputc(c). Signals success by returning c. --If c == eof(), there is no character to append. Signals success by returning a value other than eof(). Notes: The function can alter the number of write positions available as a result of any call. Returns: eof() to indicate failure. 1 The function can make a write position available only if (mode & ios_base::out) != 0. To make a write position available, the function reallocates (or initially allocates) an array object with a sufficient number of elements to hold the current array object (if any), plus one additional write position. If (mode & ios_base::in) != 0, the func tion alters the read end pointer egptr() to point just past the new write position (as does the write end pointer epptr()). 27.7.1.2.3 basic_stringbuf::pbackfail [lib.stringbuf::pbackfail] // virtual int_type pbackfail(int_type c = eof()); inherited +------- BEGIN BOX 25 -------+ Check vs. _lib.streambuf::pbackfail_ and _lib.filebuf::pbackfail_ +------- END BOX 25 -------+ Effects: Puts back the character designated by c to the input sequence, if possible, in one of three ways: --If c != eof(), if the input sequence has a putback position avail able, and if char_type(c) == char_type(gptr()[-1]), assigns gptr() - 1 to gptr(). Returns: c. --If c != eof(), if the input sequence has a putback position avail able, and if mode & ios_base::out is nonzero, assigns c to *--gptr(). Returns: char_type(c). --If c == eof() and if the input sequence has a putback position available, assigns gptr() - 1 to gptr(). Returns: char_type(c). Returns: eof() to indicate failure. Notes: If the function can succeed in more than one of these ways, it is unspecified which way is chosen. 27.7.1.2.4 basic_stringbuf::underflow [lib.stringbuf::underflow] // virtual int_type underflow(); inherited Returns: If the input sequence has a read position available, returns char_type(*gptr()). Otherwise, returns eof(). 27.7.1.2.5 basic_stringbuf::seekoff [lib.stringbuf::seekoff] // virtual pos_type seekoff(off_type off, ios_base::seekdir way, // ios_base::openmode which // = ios_base::in | ios_base::out); inherited +------- BEGIN BOX 26 -------+ Check vs. _lib.filebuf::seekpos_ +------- END BOX 26 -------+ Effects: Alters the stream position within one of the controlled sequences, if possible, as indicated in Table 14: Table 14--seekoff positioning +----------------------------------------------------------------------------+ | Conditions Result | +----------------------------------------------------------------------------+ (which & basic_ios::in) != 0positions the input sequence | +----------------------------------------------------------------------------+ (which& basic_ios::out) != 0positions the output sequence | +----------------------------------------------------------------------------+ |Otherwise, | (which & (basic_ios::in | positions both the input and the output sequences| basic_ios::out)) == (ba | sic_ios::in | ba | sic_ios::out)) | |and way == either ba | sic_ios::beg or ba | sic_ios::end | +----------------------------------------------------------------------------+ Otherwise, the positioning operation fails. | +----------------------------------------------------------------------------+ 1 For a sequence to be positioned, if its next pointer is a null pointer, the positioning operation fails. Otherwise, the function determines newoff as indicated in Table 15: Table 15--newoff values +---------------------------------------------------------+ | Condition newoff Value | +---------------------------------------------------------+ |way == basic_ios::beg 0 | +---------------------------------------------------------+ |way == basic_ios::cur the next pointer minus the be | | ginning pointer (xnext - xbeg). | +---------------------------------------------------------+ |way == basic_ios::end the end pointer minus the be | | ginning pointer (xend - xbeg) | +---------------------------------------------------------+ |If (newoff + off) < 0, the positioning operation fails | |or (xend - xbeg) < | |(newoff + off) | +---------------------------------------------------------+ 2 Otherwise, the function assigns xbeg + newoff + off to the next pointer xnext. Returns: pos_type(newoff), constructed from the resultant offset newoff (of type off_type), that stores the resultant stream position, if possi ble. If the positioning operation fails, or if the constructed object cannot represent the resultant stream position, the object stores an invalid stream position. 27.7.1.2.6 basic_stringbuf::seekpos [lib.stringbuf::seekpos] // virtual pos_type seekpos(pos_type sp, // ios_base::openmode which // = ios_base::in // | ios_base::out); inherited +------- BEGIN BOX 27 -------+ Check vs. _lib.filebuf::seekpos_ +------- END BOX 27 -------+ Effects: Alters the stream position within one of the controlled sequences, if possible, to correspond to the stream position stored in sp (as described below). --If (which & basic_ios::in) != 0, positions the input sequence. --If (which & basic_ios::out) != 0, positions the output sequence. --If the function positions neither sequence, the positioning opera tion fails. 1 For a sequence to be positioned, if its next pointer is a null pointer, the positioning operation fails. Otherwise, the function determines newoff from sp.offset(): --If newoff is an invalid stream position, has a negative value, or has a value greater than (xend - xbeg), the positioning operation fails. --Otherwise, the function adds newoff to the beginning pointer xbeg and stores the result in the next pointer xnext. Returns: pos_type(newoff), constructed from the resultant offset newoff (of type off_type), that stores the resultant stream position, if possi ble. If the positioning operation fails, or if the constructed object cannot represent the resultant stream position, the object stores an invalid stream position. 27.7.1.2.7 basic_stringbuf::setbuf [lib.stringbuf::setbuf] // virtual basic_streambuf<charT,traits>* // setbuf(char_type* s, streamsize n); inherited Effects: Performs an operation that is defined separately for each class derived from basic_stringbuf<charT,traits>. Default behavior: The same as for basic_streambuf<charT,traits>:: set buf(char_type*,streamsize). 27.7.2 Template class basic_istringstream [lib.istringstream] namespace std { template <class charT, class traits = ios_traits<charT> > class basic_istringstream : public basic_istream<charT,traits> { public: typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } public: basic_istringstream(ios_base::openmode which = ios_base::in); basic_istringstream(const basic_string<charT>& str, ios_base::openmode which = ios_base::in); virtual ~basic_istringstream(); basic_stringbuf<charT,traits>* rdbuf() const; basic_string<charT> str() const; void str(const basic_string<charT>& s); }; } 1 The class basic_istringstream<charT,traits> is a derivative of basic_istream<charT,traits> that assists in the reading of objects of class basic_stringbuf<charT,traits>. It supplies a basic_stringbuf object to control the associated array object. 27.7.2.1 basic_istringstream [lib.basic.istringstream.m.cons] constructors basic_istringstream(ios_base::openmode which = ios_base::in); Effects: Constructs an object of class basic_istringstream<charT,traits>, initializing the base class with basic_istream<charT,traits>(&sb). basic_istringstream(const basic_string<charT>& str, ios_base::openmode which = ios_base::in); Effects: Constructs an object of class basic_istringstream<charT,traits>, initializing the base class with basic_istream<charT,traits>(&sb). 27.7.2.2 Member functions [lib.istringstream.members] 27.7.2.2.1 basic_istringstream::rdbuf [lib.istringstream::rdbuf] basic_stringbuf<charT,traits>* rdbuf() const; Returns: dynamic_cast<basic_stringbuf<charT,traits>*> (basic_istream<harT,traits>::rdbuf()). 27.7.2.2.2 basic_istringstream::str [lib.istringstream::str] basic_string<charT> str() const; Returns: rdbuf().str(). void str(const basic_string<charT>& s); Effects: Calls rdbuf().str(s). 27.7.2.3 Class basic_ostringstream [lib.ostringstream] namespace std { template <class charT, class traits = ios_traits<charT> > class basic_ostringstream : public basic_ostream<charT,traits> { public: typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } public: basic_ostringstream(ios_base::openmode which = ios_base::out); basic_ostringstream(const basic_string<charT>& str, ios_base::openmode which = ios_base::out); virtual ~basic_ostringstream(); basic_stringbuf<charT,traits>* rdbuf() const; basic_string<charT> str() const; void str(const basic_string<charT>& s); }; } 1 The class basic_ostringstream<charT,traits> is a derivative of basic_ostream<charT,traits> that assists in the writing of objects of class basic_stringbuf<charT,traits>. It supplies a basic_stringbuf object to control the associated array object. 27.7.2.4 basic_ostringstream [lib.basic.ostringstream.cons] constructors basic_ostringstream(ios_base::openmode which = ios_base::out); Effects: Constructs an object of class basic_ostringstream, initializing the base class with basic_ostream(&sb). basic_ostringstream(const basic_string<charT>& str, ios_base::openmode which = ios_base::out); Effects: Constructs an object of class basic_ostringstream<charT,traits>, initializing the base class with basic_ostream<charT,traits>(&sb). 27.7.2.5 Member functions [lib.ostringstream.members] 27.7.2.5.1 basic_ostringstream::rdbuf [lib.ostringstream::rdbuf] basic_stringbuf<charT,traits>* rdbuf() const; Returns: dynamic_cast<basic_stringbuf<charT,tratis>*> (basic_ostream<charT,traits>::rdbuf()). 27.7.2.5.2 basic_ostringstream::str [lib.ostringstream::str] basic_string<charT> str() const; Returns: rdbuf().str(). void str(const basic_string<charT>& s); Effects: Calls rdbuf().str(s). 27.8 File-based streams [lib.file.streams] 1 Headers: <cstream> and <fstream> (Table 16): +------- BEGIN BOX 28 -------+ ISSUE: Disposition of <cstream> and convbuf (next 10.5 pages) TBD. +------- END BOX 28 -------+ Table 16--Header <cstream> synopsis +-----------------------------------------------------------------------+ | Type Name(s) | +-----------------------------------------------------------------------+ |Template class: basic_convbuf | +-----------------------------------------------------------------------+ |Template structs: conv_traits ios_conv_traits | +-----------------------------------------------------------------------+ |Structs: conv_traits<wchar_t> ios_conv_traits<wstreampos> | +-----------------------------------------------------------------------+ 27.8.1 Multi-byte conversions [lib.conv.fstreams] 1 The header <cstream> defines one type, basic_convbuf that associates its internal stream buffers holding a sequence of characters with the external source/sink stream representing a sequence of another type of characters. --Conversion There is a bidirectional conversion between the external source/sink stream and character sequences held in the basic_convbuf class object. --uchar_type: underlaid character container type The external source/sink stream can be regarded as a sequence of a character con tainer type, which may be different to charT. The character con tainer type on the external source/sink stream is called the under laid character container type, or uchar_type. --Encoding rule Performing the conversion from a uchar_type character sequences to the corresponding character sequence, the basic_convbuf may parse the uchar_type sequence to extract the corresponding char acter represented on the uchar_type sequence. The rule how a cer tain character is to be represented on a sequence of uchar_type characters is called the encoding rule. The basic_convbuf can be regarded as having a (virtual) conversion machine which obeys the encoding rule to parse uchar_type sequences. --Conversion state The conversion machine has its internal state cor responding to a certain position of the external source/sink stream. If the basic_convbuf stops the conversion to resume later, it has to save its internal state, so a class or a type is prepared for saving the state onto it so that an user of the basic_convbuf class object can handle it. The class (or the type) is called the conversion state. -- +------- BEGIN BOX 29 -------+ Multibyte character I/O support The basic_convbuf can support multi byte character file I/O operations. Provided that the code conversion functions between multibyte characters and wide characters are pre pared, we may specify the conversion state, and the conversion func tions in the ios_conv_traits so that the basic_convbuf can handle this multibyte characters. +------- END BOX 29 -------+ 27.8.1.1 Template class conv_traits [lib.conv.traits] template <class charT> struct conv_traits {} struct conv_traits<wchar_t> { typedef ios_traits<wchar_t> char_traits; typedef ios_traits<wstreampos> pos_traits; typedef ios_conv_traits<state_t> conv_traits; }; 1 The template struct conv_traits<charT> is a traits classwhich main tains the definitions of the types and functions necessary to imple ment the template class basic_convbuf. The template parameter charT reprsents the character container type and each specialized version of conv_traits provides the default definitions corresponding to the spe cialized character container type. 2 The conv_traits<charT> declaration has three members, ios_traits, ios_traits, and ios_conv_traits. 3 Although the former two of them are same as in the ios_traits<charT>, the last traits, ios_conv_traits<charT> provides all the definitions about types and functions necessary to perform conversion. 27.8.1.2 Template class ios_conv_traits [lib.ios.conv.traits] template <class stateT> struct ios_conv_traits {}; 1 As is the other traits structs, there is no definition in the declara tion of the template struct, ios_conv_traits. All of the definitions related to the conversion and necessary to implement basic_convbuf class shall be provided in a template version, ios_conv_traits<STATE_T> specialized for a conversion state STATE_T. 27.8.1.2.1 Struct [lib.ios.conv.traits.state.t] ios_conv_traits<STATE_T> struct ios_conv_traits<STATE_T> { typedef CHAR_T char_type; typedef STATE_T conv_state; typedef UPOS_T conv_upos; typedef UCHAR_T uchar_type; typedef POS_T pos_type; typedef OFF_T off_type; typedef codecnv<uchar_type,char_type,conv_state> codecvt_in; typedef codecnv<char_type,uchar_type,conv_state> codecvt_out; result convin(codecvt_in*, conv_state&, const uchar_type*, const uchar_type*, const uchar_type*&, char_type*, char_typeT*, char_type*&); result convout(codecvt_out*, conv_state&, const char_type*, const char_type*, const char_type*&, uchar_type*, uchar_type*, uchar_type*&); pos_type get_pos(conv_state&, conv_upos&); off_type get_off(conv_state&, conv_upos&); conv_state get_posstate pos_type&); conv_state get_offstate(off_type&); conv_upos get_posupos (pos_type&); conv_upos get_offupos (off_type&); }; 1 A specialized version of the struct ios_conv_traits<STATE_T>is neces sary to use the basic_convbufclass. In order to construct a special ized version of the struct, the following set of types and functions shall be provided. --CHAR_T : is the character container type which shall be same as the template parameter of the class, conv_traits. --STATE_T : is the conversion state type which also the template parameter type of this traits. It is the parsing/tracing state which the function, convin and convout are taken. --Every type of conversion states have a state, called initial state, which corresponds to the state beginning to parse a new sequence. The constructor, STATE_T::STATE_T() or STATE_T::STATE_T(0) constructs the initial state. --UCHAR_T : is the underlaid character container type for the external source/sink stream handled by the basic_convbuf. --UPOS_T : is the repositional information type for the external source/sink stream. It is used to implement the seekpos/seekoff member functions in the basic_convbuf. --POS_T : is the repositional information which the basic_convbuf sup ports for the client of the object. It shall be the same as the template parameter type of the struct ios_traits in the same conv_traits. --OFF_T : is an integral type which is used as the repositional infor mation which the basic_convbufsupports. 27.8.1.2.1.1 convin [lib.ios.conv.traits.state.t::convin] result vin(codecvt_in* ccvt, conv_state& stat, const uchar_type* from, const uchar_type* from_end, const uchar_type*& from_next, char_type* to, char_typeT* to_limit, char_type*& to_next); 1 The conversion state designated by stat represents the parsing state on the underlaid source sequence. According to the conversion state designated by stat, it begins to parse the source character sequence whose begining and end position designated by from and from_end to convert them. It stores the result sequence (if any) into the succes sive location of an array pointed to by to and to_limit. The conver sion stops when either of the following occurs: 1)parses all of the underlaid character sequences and stores the last character into the destination array. 2)fills all of the destination array and no more room to store. 3)encounters an invalid underlaid character in the source sequence. 2 In case (1), it returns ok. In case (2), it returns partial. In case (3), it returns error. 3 In all cases it leaves the from_next and to_next pointers pointing one beyond the last character successfully converted and leaves the con version state onto the stat for the next time conversion. If case (3) occurs, the conversion state on the stat becomes undefined value. No more conversion with the value is available. 4 If the locale-dependent conversion functions are needed, the nconver sion function which the codecvt facet object, ccnv provides is avail able as the following invokation: ccnv.convert(stat, from, from_end, from_next, to, to_limit, to_next); 5 The default conversion function depends on the locale_codecvt facets. Users can customize the encoding scheme by specifying their own con version functions in a new conv_traits class. 27.8.1.2.1.2 convout [lib.ios.conv.traits.state.t::convout] result convout(codecvt_out* ccvt, conv_state&, const char_type from*, const char_type* from_end, const char_type*& from_next., uchar_type*, uchar_type*, uchar_type*&); 1 The conversion state designated by stat represents the parsing state on the underlaid destination sequence. It begins to convert the source character sequence whose begining and end position designated by from and from_end. According to the conversion state designated by stat, it stores the result destination underlaid chracter sequence (if any) into the successive location of an array pointed to by to and to_limit. The conversion stops when either of the following occurs: 1)consumes all of the source character sequences and stores the last underlaid character into the destination array. 2)fills all of the destination array and no more room to store. 3)encounters an invalid character in the source sequence. 2 In case (1), it returns ok. In case (2), it returns partial. In case (3), it returns error. 3 In all cases it leaves the from_next and to_next pointers pointing one beyond the last character successfully converted and leaves the con version state onto the stat for the next time conversion. If case (3) occurs, the conversion state on the stat becomes undefined value. No more conversion with the value is available. 4 If the locale-dependent conversion functions are needed, the conver sion function which the codecvt facet object, ccnv provides is avail able as the following invocation; ccnv.convert(stat, from, from_end, from_next, to, to_limit, to_next); 5 The default conversion function is depends on the locale_codecvt facets. Users can customize the encoding scheme by specifying their own conversion functions in a new conv_traits class. 27.8.1.2.1.3 get_pos and [lib.ios.conv.traits.state.t::get.pos] get_off pos_type get_pos(conv_state& stat, conv_upos& upos); off_type get_off(conv_state&, conv_upos&); Effects: Constructs the pos_type object or off_type object from the conver sion state, stat and the repositional information for the underlaid stream, upos and returns it. These are used to make the return value of the basic_convbuf::seekpos/seekoff protected member func tion. 27.8.1.2.1.4 [lib.ios.conv.traits.state.t::get.pos.state] get_posstate and get_offstate conv_state get_posstate(pos_type& pos); conv_state get_offstate(off_type& off); 1 Extract the conversion state held by the repositional information, pos or off. These are used to reset the conversion state maintained in the basic_convbuf class object when the basic_convbuf::seetpos/seekoff functions are performed. 27.8.1.2.1.5 [lib.ios.conv.traits.state.t::get.pos.upos] ios_conv_traits<STATE_T>::get_posupos and get_offupos conv_upos get_posupos(pos_type&); conv_upos get_offupos(off_type&); 1 Extract the repositioning information for the underlaid stream from the repositioning information on the basic_convbuf stream. These are used in the basic_convbuf::seekpos/seekoff protected member functions to reposition the external source/sink stream. 27.8.1.2.2 Struct [lib.ios.conv.traits.wstreampos] ios_conv_traits<wstreampos> struct ios_conv_traits<wstreampos> { typedef wchar_t char_type; typedef STATE_T conv_state; typedef UPOS_T conv_upos; typedef char uchar_type; typedef wstreampos pos_type; typedef wstreamoff off_type; typedef codecnv<char,wchar_t,STATE_T> codecnv_in; typedef codecnv<wchar_t,char,STATE_T> codecnv_out; result convin(codecvt_in* ccvt, conv_state& stat, const char *from, const char* from_end, const char*& from_next, wchar_t* to, wchar_t* to_limit, wchar_t*& to_next) { return ccvt->convert (stat, from, from_end, from_next, to, to_limit, to_next); } result convout(codecvt_out* ccvt, conv_state& stat, const wchar_t* from, const wchar_t* from_end, const wchar_t*& from_next, char* to, char* to_limit, char* to_next) { return ccvt->convert (stat, from, from_end, from_next, to, to_limit, to_next); } pos_type get_pos(conv_state&, conv_upos&); off_type get_off(conv_state&, conv_upos&); conv_state get_posstate(pos_type&); conv_state get_offstate(off_type&); conv_upos get_posupos (pos_type&); conv_upos get_offupos (off_type&); }; 1 The specialized version of the struct, ios_conv_traits<wstreampos> supports the wide-oriented basic_convbuf class and the conversion between wide characters and multibyte characters as the underlaid character sequence. The types, STATE_T and UPOS_T are implementation- defined types. The behavior of the conversion functions depend on those of the locale object. 2 The encoding rule of the multibyte characters is implementation- defined. 27.8.1.3 Template class basic_convbuf [lib.basic.convbuf] template <class charT, class traits = conv_traits<charT> > class basic_convbuf : public basic_streambuf<charT,traits> { public: typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } private: typedef traits::conv_traits::conv_state state_type; typedef traits::conv_traits::conv_upos upos_type ; public: basic_convbuf(); virtual ~basic_convbuf(); protected: // virtual int_type overflow (int_type c = eof()); inherited // virtual int_type pbackfail(int_type c = eof()); inherited // virtual int_type underflow(); inherited // virtual int_type uflow(); inherited // virtual streamsize xsgetn(charT* s, streamsize n); inherited // virtual streamsize xsputn(const charT* s, streamsize n); inherited // virtual pos_type seekoff(off_type, ios_base::seekdir way, // ios_base::openmode which // = ios_base::in // | ios_base::out); inherited // virtual pos_type seekpos(pos_type sp, ios_base::openmode which // = ios_base::in // | ios_base::out); inherited // virtual basic_streambuf<charT,traits>* // setbuf(charT* s, streamsize n); inherited // virtual int sync(); inherited private: // state_type state; exposition only }; 1 The template class basic_convbuf<charT,traits> is derived from basic_streambuf<charT,traits> to associate the character sequences and the underlaid character sequences. It performs the conversion between these two types of chracter sequences. 2 For the sake of exposition, the basic_convbuf maintains the conversion state to restart the conversion to read/write the character sequence from/to the underlaid stream. 27.8.1.3.1 basic_convbuf constructor [lib.basic.convbuf.cons] basic_convbuf(); Effects: Constructs an object of template class basic_convbuf<charT,traits>, initializing the base class with basic_streambuf<charT,traits>(), and initializing; --state with state_type(0) as to specify initial state. 27.8.1.3.2 basic_convbuf destructor [lib.basic.convbuf.des] virtual ~basic_convbuf(); Effects: Destroys an object of class basic_convbuf<charT,traits>. 27.8.1.3.3 basic_convbuf::overflow [lib.basic.convbuf.overflow] virtual int_type overflow(int_type c = eof()); Effects: Behaves the same as basic_streambuf<charT,traits>::overflow(c), except that the behavior of ``consuming a character'' is as follows: --(1) Converting the characters to be consumed into the underlaid character sequence with the function traits::conv_traits::convout(). --(2) The result underlaid character sequence is appended to the asso ciated output stream. 27.8.1.3.4 [lib.basic.convbuf::pbackfail] basic_convbuf::pbackfail virtual int_type pbackfail(int_type c); Effects: Puts back the character designated by c to the input sequence, if possible, in one of three ways: +------- BEGIN BOX 30 -------+ Because the parsing on the underlaid character sequence generally can only go advance or most of parsing machined cannot go back, some of the basic_convbuf implementations cannot ``put back characters directly to the associated input sequence.'' So the behaviors related to putting back the associated input stream are removed. +------- END BOX 30 -------+ --If c != eof(), if either the input sequence has a putback position available or the function makes a putback position available, and if (charT)c == (charT)gptr()[-1], assigns gptr() - 1 to gptr(). Returns (charT)c. --If c != eof(), if either the input sequence has a putback position available or the function makes a putback position available, and if the function is permitted to assign to the putback position, assigns c to *--gptr(). Returns (charT)c. --If c == eof() and if either the input sequence has a putback posi tion available or the function makes a putback posotion available, assigns gptr() - 1 to gptr(). Returns (charT)c. Returns: eof() to signal the failure. Notes: 1 The function does not put back a character directly to the input sequence. 2 If the function can succeed in more than one of these ways, it is unspecified which way is chosen. The function can alter the number of putback positions available as a result of any call. 3 Default behavior: returns traits::eof(). 27.8.1.3.5 [lib.basic.convbuf::underflow] basic_convbuf::underflow // virtual int_type underflow(); inherited Returns: the first character of the pending sequence, if possible, without moving the stream position past it. If the pending sequence is null then the function fails. 1 The pending sequence of characters is defined as the concatenation of: a)If gptr() is non- NULL, then the egptr() - gptr() characters start ing at gptr(), otherwise the empty sequence. b)Some sequence (possibly empty) of characters read from the input stream. --These underlaid character sequence shall be converted by the func tion traits::conv_traits::convin() before concatinating to construct the pending sequence. In case that there remains some underlaid characters which cannot be converted to any more characters, we treat it empty as the subsequence (b). 2 The result character is the first character of the pending sequence, if any. The backup sequence is defined as the concatenation of: a)If eback() is non- NULL then empty, otherwise the gptr() - eback() characters beginning at eback(). b)the result character. 3 The function sets up gptr() and egptr() satisfying: a)In case the pending sequence has more than one character the egptr() - gptr() characters starting at gptr() are the characters in the pending sequence after the result character. b)If the pending sequence has exactly one character, then gptr() and egptr() may be NULL or may both be set to the same non- NULL pointer. 4 If eback() and gptr() are non- NULL then the function is not con strained as to their contents, but the ``unusual backup condition'' is that either: a)If the backup sequence contains at least gptr() - eback() charac ters, then the gptr() - eback() characters starting at eback() agree with the last gptr() - eback() characters of the backup sequence. b)Or the n characters starting a gptr() - n agree with the backup sequence (where n is the length of the backup sequence) Returns: eof() to indicate failure. 5 Default behavior: returns traits::eof(). 27.8.1.3.6 basic_convbuf::seekoff [lib.convbuf::seekoff] // virtual pos_type seekoff(off_type off, ios_base::seekdir way, // ios_base::openmode which // = ios_base::in | ios_base::out); inherited Effects: Behaves the same as basic_streambuf<charT,traits>::seekoff(off,way,which), except that the behavior ``alters the stream position'' means that: --(a) altering the underlaid character stream position which they get with the return value of the traits::conv_traits::get_posupos(off_type&); and, --(b) restoring the current conversion state by resetting the member, state with the return value of the traits::conv_traits::get_offstate(off_type&). 27.8.1.3.7 basic_convbuf::seekpos [lib.convbuf::seekpos] // virtual pos_type seekpos(pos_type sp, // ios_base::openmode which // = ios_base::in | ios_base::out); inherited 1 At first do sync() to clear up the get buffer, and alters the stream position, as follows: --(a) altering the underlaid character stream position by which the function, traits::conv_traits::get_posupos(pos), returns. and, --(b) restoring the member, state with the return value of the traits::conv_traits::get_posstate(pos). Returns: pos_type, newpos, constructed from the resultant upos and state if both (a) and (b) are successfully terminated. 2 If either or both (a) or/and (b) fail(s), or if the constructed object cannot represent the resultant stream position, the object stores an invalid stream position. 3 Whichever value is specified in the which parameters, the basic_convbuf handles only one external source/sink stream. 4 If (a) succeeds, returns a newly constructed streampos object returned by traits::conv_traits::get_pos(state, upos) where upos is a UPOS_T type object which represent the current position of the underlaid stream. 5 Otherwise, the object stores an invalid stream position. 27.8.1.3.8 basic_convbuf::setbuf [lib.convbuf::setbuf] // virtual basic_streambuf<charT,traits>* // setbuf(char_type* s, streamsize n); inherited 1 Makes the array of n ( charT type) characters, whose first element is designated by s, available for use as a buffer area for the controlled sequences, if possible. +------- BEGIN BOX 31 -------+ The basic_convbuf does not fix the buffer management strategy. It remains alternatives for the derived class designers. +------- END BOX 31 -------+ 27.8.1.3.9 basic_convbuf::sync [lib.convbuf::sync] // virtual int sync(); inherited 1 Reflects the pending sequence to the external sink sequence and reset the get/put buffer pointers. It means that if there are some unread sequence on the get buffer and the external source sequense is not seekable, the unread sequence is perfectly lost. 2 The detailed behavior is as follows: a)Consumes all of the pending sequence of characters, (as pending sequence and ``consumes the sequence,'' see the description in the basic_streambuf<charT,traits>::overflow() _lib.streambuf::overflow_) In case that consuming means appending characters to the associated output stream, the character sequense shall be converted to the cor responding underlaid character sequence by the traits::conv_traits::convout(). b)Clears all of the following pointers: pbase(), pptr(), epptr(), eback(), gptr(), and egptr(). Returns: -1 if (a) fails, otherwise 0. 27.8.1.4 Examples of trait specialization [lib.examples.traits] class fstate_t { ... }; // Implementation-defined conversion state // object which is for file I/O. class wfstate_t { ... }; template <class charT> struct file_traits {}; struct file_traits<char> { typedef ios_traits<char> char_traits; typedef ios_traits<streampos> char_pos; typedef ios_conv_traits<fstate_t> conv_pos; }; struct file_traits<wchar_t>{ typedef ios_traits<char> char_traits; typedef ios_traits<wstreampos> char_pos; typedef ios_conv_traits<wfstate_t> conv_pos; }; template <class stateT> struct ios_file_traits {}; // // Specialized for the single-byte filebuf // struct ios_conv_traits<fstate_t> { typedef char char_type; // char/wchar_t... typedef fstate_t conv_state; // key parameter(mainly depend on uchar_type) typedef streamoff conv_upos; // Physical file offset typedef char uchar_type; // Physical file I/O typedef streampos pos_type; // Enough to large typedef streamoff off_type; // Enough to large typedef codecnv<char,wchar_t,fstate_t> codecnv_in; typedef codecnv<wchar_t,char,fstate_t> codecnv_out; result convin(codecvt_in* ccvt, conv_state& stat, const char *from, const char* from_end, const char*& from_next, char* to, char* to_limit, char*& to_next) { return ccvt->convert (stat, from, from_end, from_next, to, to_limit, to_next); } result convout(codecvt_out* ccvt, conv_state& stat, const char* from, const char* from_end, const char*& from_next, char* to, char* to_limit, char* to_next) { return ccvt->convert (stat, from, from_end, from_next, to, to_limit, to_next); } pos_type get_pos(conv_state&, conv_upos&); off_type get_off(conv_state&, conv_upos&); conv_state get_posstate(pos_type&); conv_state get_offstate(off_type&); conv_upos get_posupos (pos_type&); conv_upos get_offupos (off_type&); }; // // Specialized for the wfilebuf // struct ios_conv_traits<wfstate_t> { typedef wchar_t char_type; // char/wchar_t... typedef wfstate_t conv_state; // key parameter(mainly depend on uchar_type) typedef streamoff conv_upos; // Physical file offset typedef char uchar_type; // Physical file I/O typedef wstreampos pos_type; // Enough to large typedef wstreamoff off_type; // Enough to large typedef codecnv<char,wchar_t,fstate_t> codecnv_in; typedef codecnv<wchar_t,char,fstate_t> codecnv_out; result convin (codecvt_in* ccvt, conv_state& stat, const char *from, const char* from_end, const char*& from_next, wchar_t* to, wchar_t* to_limit, wchar_t*& to_next) { return ccvt->convert (stat, from, from_end, from_next, to, to_limit, to_next); } result convout (codecvt_out* ccvt, conv_state& stat, const wchar_t* from, const wchar_t* from_end, const wchar_t*& from_next, char* to, char* to_limit, char* to_next) { return ccvt->convert (stat, from, from_end, from_next, to, to_limit, to_next); } pos_type get_pos (conv_state&, conv_upos&); // wstreampos get_pos (wfstate_t&, streampos); off_type get_off (conv_state&, conv_upos&); // wstreamoff get_off (wfstate_t&, streampos); conv_state get_posstate (pos_type&); // wfstate_t get_posstate (wstreampos&); conv_state get_offstate (off_type&); // wfstate_t get_offstate (wstreamoff&); conv_upos get_posupos (pos_type&); // conv_upos get_offupos (off_type&); }; 27.8.2 File streams [lib.fstreams] Header <fstream> synopsis #include <cstream> // for conv_traits, basic_convbuf #include <streambuf> #include <istream> #include <ostream> namespace std { template <class charT, class traits = conv_traits<charT> > class basic_filebuf; typedef basic_filebuf<char> filebuf; typedef basic_filebuf<wchar_t> wfilebuf; template <class charT, class traits = file_traits<charT> > class basic_ifstream; typedef basic_ifstream<char> ifstream; typedef basic_ifstream<wchar_t> wifstream; template <class charT, class traits = file_traits<charT> > class basic_ofstream; typedef basic_ofstream<char> ofstream; typedef basic_ofstream<wchar_t> wofstream; } 1 The header <fstream> defines six types that associate stream buffers with files and assist reading and writing files. +------- BEGIN BOX 32 -------+ basic_filebuf<charT,traits> should be specified so that it treats a file as a sequence of charT. Except for filebuf and wfilebuf that implies it treats the file as binary. +------- END BOX 32 -------+ 2 In this subclause, the type name FILE is a synonym for the type FILE.45) --File A File provides an external source/sink stream whose underlaid character type is char (byte). --Multibyte characters and Files Class basic_filebuf is derived from basic_convbuf to support multibyte character I/O. A File is a sequence of multibyte characters. In order to provide the contents as a wide character sequence, wfilebuf should convert between wide character sequences and multibyte character sequences. --basic_filebuf Derived from basic_convbuf. Even the single byte character version because single byte code conversion may be neces sary... A basic_filebuf provide... file I/O, char/wchar_t parity. fstate_t. ios_conv_traits --Customize Mechanism Change name ( conv_traits-> file_traits), cus tomize ios_conv_traits<fstate_t>. Modify the definition of _________________________ 45) FILE is defined in <cstdio> (_lib.c.files_). ios_conv_traits. --Multibyte character and Files A File provides byte sequences. So the streambuf (or its derived classes) treats a file as the external source/sink byte sequence. In a large character set environment, multibyte character sequences are held in files. In order to pro vide the contents of a file as wide character sequences, wide- oriented filebuf, namely wfilebuf should convert wide character sequences. Because of necessity of the conversion between the external source/sink streams and wide character sequences. 27.8.2.1 Template class basic_filebuf [lib.filebuf] namespace std { template <class charT, class traits = conv_traits<charT> > class basic_filebuf : public basic_convbuf<charT,traits> { public: typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } public: basic_filebuf(); virtual ~basic_filebuf(); bool is_open() const; basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode); // basic_filebuf<charT,traits>* open(const char* s, ios::open_mode mode); basic_filebuf<charT,traits>* close(); protected: // virtual int_type overflow (int_type c = eof()); inherited // virtual int_type pbackfail(int_type c = eof()); inherited // virtual int showmany(); inherited // virtual int_type underflow(); inherited // virtual int_type uflow(); inherited // virtual streamsize xsgetn(char_type* s streamsize n); inherited // virtual streamsize xsputn(const char_type* s, streamsize n); inherited // virtual pos_type seekoff(off_type off, // ios_base::seekdir way, // ios_base::openmode which // = ios_base::in // | ios_base::out); inherited // virtual pos_type seekpos(pos_type sp, // ios_base::openmode which // = ios_base::in // | ios_base::out); inherited // virtual basic_streambuf<charT,traits>* // setbuf(char_type* s, streamsize n); inherited // virtual int sync(); inherited private: // FILE* file; exposition only }; } 1 The class basic_filebuf<charT,traits> is derived from basic_streambuf<charT,traits> to associate both the input sequence and the output sequence with an object of type FILE. +------- BEGIN BOX 33 -------+ For the sake of exposition, the maintained data is presented here as: --FILE* file, points to the FILE associated with the object of class basic_filebuf<charT,traits>. +------- END BOX 33 -------+ 2 The restrictions on reading and writing a sequence controlled by an object of class basic_filebuf<charT,traits> are the same as for read ing and writing its associated file. In particular: --If the file is not open for reading or for update, the input sequence cannot be read. --If the file is not open for writing or for update, the output sequence cannot be written. --A joint file position is maintained for both the input sequence and the output sequence. 3 In order to support file I/O and multibyte/wide character conversion, the following arrangement is applied to the traits structures: --Specify char as the underlaid character type, uchar_type defined in the ios_conv_traits<>. --Define state_t, the template parameter of the ios_conv_traits<>, so that it can apply to the conversion function. In case the conver sion function provided by the codecvt facet uses, we adopt a spe cialized template parameter stateT for the locale-oriented conver sion function suitable for the multibyte/wide character conversion. Now we assume the name of the conversion state object is fstate_t. --Define streamoff (or streampos ) as the repositional information for the underlaid byte sequence. --Define streamoff, wstreampos for the wide-oriented streambufs (or filebufs) so that some composite function in the ios_conv_traits(), for example: wstreampos get_pos(fstate_t fs, streampos s); wstreamoff get_off(fstate_t fs, streampos s); 27.8.2.2 basic_filebuf constructors [lib.basic.filebuf.cons] basic_filebuf(); Effects: Constructs an object of class basic_filebuf<charT,traits>, initializing the base class with basic_streambuf<charT,traits>(), and initializing file to a null pointer. virtual ~basic_filebuf(); Effects: Destroys an object of class basic_filebuf<charT,traits>. Calls close(). 27.8.2.3 Member functions [lib.filebuf.members] 27.8.2.3.1 basic_filebuf::is_open [lib.filebuf::is.open] bool is_open() const; Returns: true if file is not a null pointer. 27.8.2.3.2 basic_filebuf::open [lib.filebuf::open] basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode); Effects: If file is not a null pointer, returns a null pointer. Otherwise, calls basic_streambuf<charT,traits>::basic_streambuf(). It then opens a file, if possible, whose name is the NTBS s, ``as if'' by calling fopen(s,modstr) and assigning the return value to file. 1 The NTBS modstr is determined from mode & ~ios_base::ate as indicated in Table 17: Table 17--File open modes +---------------------------------------------+ | ios_base stdio equivalent | | Value(s) | +---------------------------------------------+ |in "r" | |out | trunc "w" | |out | app "a" | |in | out "r+" | |in | binary "rb" | |out | trunc | binary "wb" | |out | app | binary "ab" | |in | out "r+ | |in | out | trunc "w+" | |in | out | app "a+" | |in | out | binary "r+b" | |in | out | trunc | binary "w+b" | |in | out | app | binary "a+b" | +---------------------------------------------+ 2 If the resulting file is not a null pointer and mode & ios_base::ate != 0, calls fseek(file,0,SEEK_END).46) 3 If fseek returns a null pointer, calls close() and returns a null pointer. Otherwise, returns this. basic_filebuf<charT,traits>* open(const char* s, ios::open_mode mode); Returns: open(s, ios_base::openmode(mode)). 27.8.2.3.3 basic_filebuf::close [lib.filebuf::close] basic_filebuf* close(); Effects: If file is a null pointer, returns a null pointer. Otherwise, if the call fclose(file) returns zero, the function stores a null pointer in file and returns this.47) Otherwise, returns a null pointer. _________________________ 46) The macro SEEK_END is defined, and the function signatures fopen(const char_type*, const char_type*) and fseek(FILE*, long, int) are declared, in <cstdio> (_lib.c.files_). 47) The function signature fclose(FILE*) is declared, in <cstdio> (_lib.c.files_). 27.8.2.3.4 basic_filebuf::overflow [lib.filebuf::overflow] // virtual int_type overflow(int_type c = eof()); inherited Effects: Behaves the same as basic_streambuf<charT,traits>::overflow(c), except that the behavior of ``consuming a character'' is as follows: --(1) Converting the characters to be consumed into the underlaid character sequence with the function traits::conv_traits::convout(). During the conversion, convout maintains the conversion state in the member rdstate(). At the end of execution of the conversion, the conversion state is saved on it. --(2) The result underlaid character sequence is written to the file specified by file. At the consumption of the pending characters, none of them are discarded. All of the characters are converted to be writted to the file. Returns: eof() to indicate failure. If file is a null pointer, the function always fails. 27.8.2.3.5 basic_filebuf::pbackfail [lib.filebuf::pbackfail] // virtual int_type pbackfail(int_type c = eof()); inherited +------- BEGIN BOX 34 -------+ Check vs. _lib.streambuf::pbackfail_. +------- END BOX 34 -------+ Effects: Puts back the character designated by c to the input sequence, if possible, in one of four ways: +------- BEGIN BOX 35 -------+ Because the parsing on the underlaid character sequence generally can only go advance or most of parsing machined cannot go back, some of the basic_convbuf implementations cannot ``put back characters directly to the associated input sequence.'' So the behaviors related to putting back the associated input stream are removed. +------- END BOX 35 -------+ --If c != eof() and if the function makes a putback position available and if char_type(c) == char_type(gptr()[-1]), assigns gptr() - 1 to gptr(). --If c != eof() and if the function makes a putback position available and if the function is permitted to assign to the putback position, assigns c to *--gptr(). --If c == eof() and if either the input sequence has a putback position available or the function makes a putback position avail able, assigns gptr() - 1 to gptr(). Returns: eof() to indicate failure, otherwise c. Notes: If file is a null pointer, the function always fails. The function does not put back a character directly to the input sequence. If the function can succeed in more than one of these ways, it is unspecified which way is chosen. The function can alter the number of putback positions available as a result of any call. Default behavior: Returns traits::eof(). +------- BEGIN BOX 36 -------+ Shall we impose Library uses onto performing sync()... make gbuffer/pbuffer empty every time they try to write after read or vice versa, as in the current MSE? No. On systems where this is necessary the basic_filebuf virtuals should keep track of the last operation performed on the FILE and do whatever is neccessary (equivalent of an fseek?) in order to reverse the direction. +------- END BOX 36 -------+ 27.8.2.3.6 basic_filebuf::showmany [lib.filebuf::showmany] // virtual int showmany(); inherited Effects: Behaves the same as basic_streambuf::showmany(). Notes: An implementation might well provide an overriding definition for this function signature if it can determine that more characters can be read from the input sequence. 27.8.2.3.7 basic_filebuf::underflow [lib.filebuf::underflow] // virtual int_type underflow(); inherited Effects: Behaves the same as basic_convbuf<charT,traits>::underflow(), except that the underlaid input character sequence is the byte sequence in the file specified by file. +------- BEGIN BOX 37 -------+ Describing the behavior about maintaining the conversion state is needed. +------- END BOX 37 -------+ 27.8.2.3.8 basic_filebuf::seekoff [lib.filebuf::seekoff] // virtual pos_type seekoff(off_type off, ios_base::seekdir way, // ios_base::openmode which // = ios_base::in // | ios_base::out); inherited +------- BEGIN BOX 38 -------+ Check vs. _lib.stringbuf::seekoff_. +------- END BOX 38 -------+ Effects: Alters the stream position within the controlled sequences, if pos sible, as described below. Returns: a newly constructed pos_type object that stores the resultant stream position, if possible. If the positioning operation fails, or if the object cannot represent the resultant stream position, the object stores an invalid stream position. 1 If file is a null pointer, the positioning operation fails. Other wise, the function determines one of three values for the argument whence, of type int, as indicated in Table 18: Table 18--seekoff effects +----------------------------------+ | way Value stdio Equivalent | +----------------------------------+ |basic_ios::beg SEEK_SET | |basic_ios::cur SEEK_CUR | |basic_ios::end SEEK_END | +----------------------------------+ 2 The function then calls fseek(file,off,whence) and, if that function returns nonzero, the positioning operation fails.48) 3 The function extracts the conversion state from off by means of get_offstate() to reset the rdstate() member. 27.8.2.3.9 basic_filebuf::seekpos [lib.filebuf::seekpos] _________________________ 48) The macros SEEK_SET, SEEK_CUR, and SEEK_END are defined, and the function signature fseek(FILE*, long, int) is declared, in <cstdio> (_lib.c.files_). // virtual pos_type seekpos(pos_type sp, // ios_base::openmode which // = ios_base::in // | ios_base::out); inherited +------- BEGIN BOX 39 -------+ [To Be Filled] Check vs. _lib.streambuf::seekpos_ and _lib.stringbuf::seekpos_. +------- END BOX 39 -------+ 27.8.2.3.10 basic_filebuf::setbuf [lib.filebuf::setbuf] // virtual basic_streambuf* setbuf(char_type* s, int n); inherited +------- BEGIN BOX 40 -------+ [To Be Filled] Check vs. _lib.streambuf::setbuf_ and _lib.stringbuf::setbuf_. +------- END BOX 40 -------+ 27.8.2.3.11 basic_filebuf::sync [lib.filebuf::sync] // virtual int sync(); inherited +------- BEGIN BOX 41 -------+ [To Be Filled] Check vs. _lib.streambuf::sync_. +------- END BOX 41 -------+ 27.8.2.4 Template class basic_ifstream [lib.ifstream] namespace std { template <class charT, class traits = file_traits<charT> > class basic_ifstream : public basic_istream<charT,traits> { public: typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } public: basic_ifstream(); basic_ifstream(const char* s, openmode mode = in); virtual ~basic_ifstream(); basic_filebuf<charT,traits>* rdbuf() const; bool is_open(); void open(const char* s, openmode mode = in); // void open(const char* s, open_mode mode = in); optional void close(); private: // basic_filebuf<charT,traits> fb; exposition only }; } 1 The class basic_ifstream<charT,traits> is a derivative of basic_istream<charT,traits> that assists in the reading of named files. It supplies a basic_filebuf<charT,traits> object to control the associated sequence. +------- BEGIN BOX 42 -------+ For the sake of exposition, the maintained data is presented here as: --basic_filebuf<charT,traits> fb, the basic_filebuf object. +------- END BOX 42 -------+ 27.8.2.5 basic_ifstream constructors [lib.basic.ifstream.cons] basic_ifstream(); Effects: Constructs an object of class basic_ifstream<charT,traits>, initial izing the base class with basic_istream<charT,traits>(&fb). basic_ifstream(const char* s, openmode mode = in); Effects: Constructs an object of class basic_ifstream, initializing the base class with basic_istream<charT,traits>(&fb), then calls open(s, mode). 27.8.2.6 Member functions [lib.ifstream.members] 27.8.2.6.1 basic_ifstream::rdbuf [lib.ifstream::rdbuf] basic_filebuf<charT,traits>* rdbuf() const; Returns: dynamic_cast<basic_filebuf<charT,traits>*> (basic_istream<charT,traits>::rdbuf()). 27.8.2.6.2 basic_ifstream::is_open [lib.ifstream::is.open] bool is_open(); Returns: rdbuf().is_open(). 27.8.2.6.3 basic_ifstream::open [lib.ifstream::open] void open(const char* s, openmode mode = in); Effects: Calls rdbuf().open(s,mode). If is_open() returns zero, calls set state(failbit). 27.8.2.6.4 basic_ifstream::close [lib.ifstream::close] void close(); Effects: Calls rdbuf().close() and, if that function returns zero, calls set state(failbit). 27.8.2.7 Template class basic_ofstream [lib.ofstream] namespace std { template <class charT, class traits = file_traits<charT> > class basic_ofstream : public basic_ostream<charT,traits> { public: typedef charT char_type; typedef traits::int_type int_type; typedef traits::pos_type pos_type; typedef traits::off_type off_type; int_type eof() { return traits::eof(); } char_type newline() { return traits::newline(); } public: basic_ofstream(); basic_ofstream(const char* s, openmode mode = out); virtual ~basic_ofstream(); basic_filebuf<charT,traits>* rdbuf() const; bool is_open(); void open(const char* s, openmode mode = out | trunc); // void open(const char* s, open_mode mode = out | trunc); optional void close(); }; } 1 The class basic_ofstream<charT,traits> is a derivative of basic_ostream<charT,traits> that assists in the writing of named files. It supplies a basic_filebuf<charT,traits> object to control the associated sequence. 27.8.2.8 basic_ofstream constructors [lib.basic.ofstream.cons] basic_ofstream(); Effects: Constructs an object of class basic_ofstream<charT,traits>, initial izing the base class with basic_ostream<charT,traits>(&fb). basic_ofstream(const char* s, openmode mode = out); Effects: Constructs an object of class basic_ofstream<charT,traits>, initial izing the base class with basic_ostream<charT,traits>(&fb), then calls open(s, mode). 27.8.2.9 Member functions [lib.ofstream.members] 27.8.2.9.1 basic_ofstream::rdbuf [lib.ofstream::rdbuf] basic_filebuf<charT,traits>* rdbuf() const; Returns: (basic_filebuf<charT,traits>*)&fb. 27.8.2.9.2 basic_ofstream::is_open [lib.ofstream::is.open] bool is_open(); Returns: rdbuf().is_open(). 27.8.2.9.3 basic_ofstream::open [lib.ofstream::open] void open(const char* s, openmode mode = out); Effects: Calls rdbuf().open(s,mode). If is_open() is then false, calls set state(failbit). 27.8.2.9.4 basic_ofstream::close [lib.ofstream::close] void close(); Effects: Calls rdbuf().close() and, if that function returns zero, calls set state(failbit). 27.8.3 C Library files [lib.c.files] 1 Headers <cstdio>, and <cwchar>. Table 18--Header <cstdio> synopsis +-------------------------------------------------------------------------------+ | Type Name(s) | +-------------------------------------------------------------------------------+ |Macros: | |BUFSIZ L_tmpnam SEEK_SET TMP_MAX | |EOF NULL <cstdio> stderr _IOFBF | |FILENAME_MAX SEEK_CUR stdin _IOLBF | |FOPEN_MAX SEEK_END stdout _IONBF | +-------------------------------------------------------------------------------+ |Types: FILE fpos_t size_t <cstdio> | +-------------------------------------------------------------------------------+ |Functions: | |clearerr fgets fscanf gets rewind tmpfile | |fclose fopen fseek perror scanf tmpnam | |feof fprintf fsetpos printf setbuf ungetc | |ferror fputc ftell putc setvbuf vprintf | |fflush fputs fwrite puts sprintf vprintf | |fgetc fread getc remove sscanf vsprintf | |fgetpos freopen getchar rename tmpfile | +-------------------------------------------------------------------------------+ Table 18--Header <cwchar> synopsis +------------------------------------------------------------------------+ | Type Name(s) | +------------------------------------------------------------------------+ |Macros: NULL <cwchar> WCHAR_MAX WCHAR_MIN WEOF <cwchar> | +------------------------------------------------------------------------+ |Types: mbstate_t wint_t <cwchar> | +------------------------------------------------------------------------+ |Struct: tm <cwchar> | +------------------------------------------------------------------------+ |Functions: | |btowc getwchar ungetwc wcscpy wcsrtombs wmemchr | |fgetwc mbrlen vfwprintf wcscspn wcsspn wmemcmp | |fgetws mbrtowc vswprintf wcsftime wcsstr wmemcpy | |fputwc mbsinit vwprintf wcslen wcstod wmemmove | |fputws mbsrtowcs wcrtomb wcsncat wcstok wmemset | |fwide putwc wcscat wcsncmp wcstol wprintf | |fwprintf putwchar wcschr wcsncpy wcstoul wscanf | |fwscanf swprintf wcscmp wcspbrk wcsxfrm | |getwc swscanf wcscoll wcsrchr wctob | +------------------------------------------------------------------------+ 2 The contents are the same as the Standard C library, except that none of the headers defines wchar_t. SEE ALSO: ISO C subclause 7.9, Amendment 1 subclause 4.6.2.