Team LiB   Previous Section   Next Section

13.30 <istream>

The <istream> header declares the input stream classes, templates, and an input manipulator.

istream is declared in <istream>, and ostream is declared in <ostream>, but iostream is declared in <istream>, not <iostream>.

See <fstream> for derived-class templates that read from files and <sstream> for derived-class templates that read from strings. See <ios> for the base-class declarations. Refer to Chapter 9 for general information about I/O.

basic_iostream class template Base class for input and output stream

template <typename charT, typename traits = char_traits<charT> >
class basic_iostream : public basic_istream<charT,traits>, 
                        public basic_ostream<charT,traits>
{
public:
  explicit basic_iostream(basic_streambuf<charT,traits>* sb);
  virtual ~basic_iostream(  );
};

The basic_iostream class template represents a stream that can perform input and output. (For details, see its base class templates, basic_istream in this section and basic_ostream in <ostream>.) Note that the two base-class templates share a common stream buffer, sb. Note also that basic_istream and basic_ostream inherit virtually from basic_ios; basic_iostream inherits a single instance of the formatting flags, iostate, and so on.

See Also

basic_istream class template, iostream class, wiostream class, basic_iostream in <ios>, basic_ostream in <ostream>

basic_istream class template Base class for input stream

template <typename chT, typename traits = char_traits<chT> >
class basic_istream : virtual public basic_ios<chT,traits>
{
public:
  // Types
  typedef chT char_type;
  typedef typename traits::int_type int_type;
  typedef typename traits::pos_type pos_type;
  typedef typename traits::off_type off_type;
  typedef traits traits_type;
   
  explicit basic_istream(basic_streambuf<chT,traits>* sb);
  virtual ~basic_istream(  );
  class sentry;
  // Formatted input
  basic_istream<chT,traits>& operator>>(basic_istream<chT,traits>&
    (*pf)(basic_istream<chT,traits>&));
  basic_istream<chT,traits>& operator>> (basic_ios<chT,traits>& |
    (*pf)(basic_ios<chT,traits>&));
  basic_istream<chT,traits>& operator>>(ios_base& (*pf)(ios_base&));
  basic_istream<chT,traits>& operator>>(bool& n);
  basic_istream<chT,traits>& operator>>(short& n);
  basic_istream<chT,traits>& operator>>(unsigned short& n);
  basic_istream<chT,traits>& operator>>(int& n);
  basic_istream<chT,traits>& operator>>(unsigned int& n);
  basic_istream<chT,traits>& operator>>(long& n);
  basic_istream<chT,traits>& operator>>(unsigned long& n);
  basic_istream<chT,traits>& operator>>(float& f);
  basic_istream<chT,traits>& operator>>(double& f);
  basic_istream<chT,traits>& operator>>(long double& f);
  basic_istream<chT,traits>& operator>>(void*& p);
  basic_istream<chT,traits>& operator>> (basic_streambuf<char_type,traits>* sb);
  // Unformatted input
  streamsize gcount(  ) const;
  int_type get(  );
  basic_istream<chT,traits>& get(char_type& c);
  basic_istream<chT,traits>& get(char_type* s, streamsize n);
  basic_istream<chT,traits>& get(char_type* s, streamsize n, char_type delim);
  basic_istream<chT,traits>& get(basic_streambuf<char_type,traits>& sb);
  basic_istream<chT,traits>& get(basic_streambuf<char_type,traits>& sb, 
                                 char_type delim);
  basic_istream<chT,traits>& getline(char_type* s, streamsize n);
  basic_istream<chT,traits>& getline(char_type* s, streamsize n, 
                                        char_type delim);
  basic_istream<chT,traits>& ignore (streamsize n = 1, int_type 
                                     delim=traits::eof(  ));
  int_type peek(  );
  basic_istream<chT,traits>& read(char_type* s, streamsize n);
  streamsize readsome(char_type* s, streamsize n);
  basic_istream<chT,traits>& putback(char_type c);
  basic_istream<chT,traits>& unget(  );
  int sync(  );
  pos_type tellg(  );
  basic_istream<chT,traits>& seekg(pos_type);
  basic_istream<chT,traits>& seekg(off_type, ios_base::seekdir);
};

The basic_istream class template is the base for all input streams. It declares members for reading from streams and for managing streams. The act of reading from a stream is also known as extracting from the stream.

All reads go through a stream buffer, which provides the low-level access to the stream data. (See the sbumpc and sgetc functions for basic_streambuf in the <streambuf> header.) If the stream buffer returns traits::eof( ) for an input operation, the stream sets failbit | eofbit in the stream's I/O state. If the buffer object throws an exception, the stream sets badbit.

Before performing an input operation (e.g., operator>> or a get( ) function), the stream constructs a sentry object. If the sentry evaluates to true, the read operation continues. If the read throws an exception, badbit is set. The second (noskipws) argument to the sentry constructor is false for the formatted functions (operator>>) and true for all other input operations. The sentry object is destroyed before the input function returns. See basic_istream::sentry later in this section for more information.

When an input operation throws an exception, the stream sets badbit. If badbit is set in the exceptions( ) mask, the stream does not throw ios_base::failure, but instead rethrows the original exception. If any input operation sets eofbit or failbit, and that bit is set in the exceptions( ) mask, the usual ios_base::failure exception is thrown.

The following are the basic_istream member functions:

explicit basic_istream(basic_streambuf<chT,traits>* sb)

Calls the basic_ios(sb) constructor and initializes gcount( ) to 0.

basic_istream<chT,traits>& operator>>(basic_istream<chT,traits>& (*manip)(basic_istream<chT,traits>&))

Returns manip(*this). See the ws function for an example of such a manipulator.

basic_istream<chT,traits>& operator>>(basic_ios<chT,traits>&(*manip)(basic_ios<chT,traits>&))
basic_istream<chT,traits>& operator>>(ios_base& (*manip)(ios_base&))

Calls manip(*this) and returns *this. See the dec function in <ios> for an example of such a manipulator.

basic_istream<chT,traits>& operator>>(bool& n)
basic_istream<chT,traits>& operator>>(short& n)
basic_istream<chT,traits>& operator>>(unsigned short& n)
basic_istream<chT,traits>& operator>>(int& n)
basic_istream<chT,traits>& operator>>(unsigned int& n)
basic_istream<chT,traits>& operator>>(long& n)
basic_istream<chT,traits>& operator>>(unsigned long& n)
basic_istream<chT,traits>& operator>>(float& f)
basic_istream<chT,traits>& operator>>(double& f)
basic_istream<chT,traits>& operator>>(long double& f)
basic_istream<chT,traits>& operator>>(void*& p)

Reads a formatted item from the stream. These formatted input functions use the num_get facet of the stream's imbued locale as shown in Example 13-16. See the <locale> header for information about num_get and locales.

Example 13-16. Using the num_get facet to format input
typedef
    std::num_get<char_type,
      std::istreambuf_iterator<char_type, traits_type> >
  numget;
std::ios_base::iostate err = 0;
std::use_facet<numget>(getloc(  )).(*this, 0, *this, err, val);
this->setstate(err);
basic_istream<chT,traits>& operator>>(basic_streambuf<char_type,traits>* sb)

Copies input to the stream buffer sb. If sb is a null pointer, the stream sets failbit and returns immediately. Otherwise, the function copies characters from the input stream to sb until it reaches the end of the input stream, writing to sb fails, or an exception is caught. If no characters are copied to sb, failbit is set. The return value is *this.

streamsize gcount( ) const

Returns the number of characters extracted by the most recent call to an unformatted member function (get, getline, ignore, peek, putback, read, readsome, and unget).

int_type get( )

Reads a single character and returns it. If no character is available, the function sets failbit and returns traits::eof( ).

basic_istream<chT,traits>& get(char_type& c)

Reads a single character and stores it in c. If no character is available, the function sets failbit and does not modify c. The return value is *this.

basic_istream<chT,traits>& get(char_type* s, streamsize n)

Returns get(s, n, widen('\n')).

basic_istream<chT,traits>& get(char_type* s, streamsize n, char_type delim)

Reads up to n - 1 characters into the character array that s points to. Reading stops at the end-of-file (which sets eofbit) or when the next character would be delim (but the delimiter character is not read from the buffer). If no characters are stored in s, failbit is set.

A null character is always appended to the end of s. The return value is *this.

basic_istream<chT,traits>& get(basic_streambuf<char_type,traits>& sb)

Returns get(sb, widen('\n')).

basic_istream<chT,traits>& get(basic_streambuf<char_type,traits>& sb, char_type delim)

Copies characters to the output buffer sb. Copying stops when an end-of-file is reached, when writing to sb fails, or when the next character to read would be delim (the delimiter is not read from the input buffer). If no characters are copied to sb, failbit is set.

basic_istream<chT,traits>& getline(char_type* s, streamsize n)

Returns getline(s, n, widen('\n')).

basic_istream<chT,traits>& getline(char_type* s, streamsize n, char_type delim)

Reads up to n - 1 characters into the character array that s points to. Reading stops at the end-of-file (which sets eofbit) or when delim is read (the delimiter character is read from the buffer but not stored in s).

If no characters are read from the stream, failbit is set. If exactly n - 1 characters are read before reaching the end-of-file, eofbit is set; otherwise, if the limit of n - 1 characters is reached before reading a delimiter, failbit is set.

A null character is always appended to the end of s. The return value is *this.

basic_istream<chT,traits>& ignore (streamsize n=1, int_type delim=traits::eof( ))

Reads characters from the input buffer and discards them. The operation stops when one of the following occurs:

  • n characters have been read and discarded if n != numeric_limits<int>::max.

  • End-of-file is reached, in which case eofbit is set.

  • delim is read if delim != traits::eof( ).

The return value is *this.

int_type peek( )

Looks ahead to the next character in the input stream. If good( ) returns true, rdbuf( )->sgetc( ) is returned; otherwise, traits::eof( ) is returned. No characters are extracted from the stream, so a subsequent call to gcount( ) returns 0.

basic_istream<chT,traits>& read(char_type* s, streamsize n)

Reads up to n characters and stores them in the array that s points to. Before reading anything, if good( ) is false, failbit is set, and nothing is read. Otherwise, if end-of-file is reached before reading n characters, eofbit and failbit are set. A null character is not appended to s. The return value is *this.

streamsize readsome(char_type* s, streamsize n)

Tries to read as many immediately available characters as possible into the array that s points to. If good( ) is false before reading, failbit is set, and readsome returns immediately. Otherwise, readsome calls rdbuf( )->in_avail( ) and does one of the following:

  • in_avail( ) == -1: eofbit is set and no characters are read

  • in_avail( ) == 0: no characters are read

  • in_avail( ) > 0: min(in_avail( ), n) characters are read into s

A null character is not appended to s. The return value is the number of characters stored in s.

basic_istream<chT,traits>& putback(char_type c)

Tries to push back the character c so it will be the next character read from the input stream. If good( ) is false, failbit is set and putback returns. Otherwise, if rdbuf( ) is not null, putback calls rdbuf( )->sputbackc(c). If rdbuf( ) is null or sputbackc returns traits::eof( ), badbit is set. The return value is *this. A subsequent call to gcount( ) returns 0.

basic_istream<chT,traits>& seekg(pos_type pos)
basic_istream<chT,traits>& seekg(off_type off, ios_base::seekdir dir)

Tries to seek to a new position in the stream. The first form specifies the position explicitly; the second form specifies the new position as an offset from a known position (beginning of file, current position, or end-of-file). If fail( ) is false, seekg calls rdbuf( )->pubseekoff(pos) or rdbuf( )->pubseekoff(off, dir). The return value is *this.

int sync( )

Synchronizes the stream buffer. If rdbuf( ) is null, sync returns -1; otherwise, sync calls rdbuf( )->pubsync( ). If pubsync returns -1, badbit is set, and sync returns -1. Otherwise, sync returns 0.

pos_type tellg( )

Returns the current position in the stream. If fail( ) is true, the return value is pos_type(-1); otherwise, the return value is rdbuf( )->pubseekoff(0, ios_base::cur, ios_base::in).

basic_istream<chT,traits>& unget( )

Tries to push back the last input character. If good( ) is false, failbit is set and unget returns. Otherwise, if rdbuf( ) is not null, putback calls rdbuf( )->sungetc( ). If rdbuf( ) is null or sungetc returns traits::eof( ), badbit is set. The return value is *this. A subsequent call to gcount( ) returns 0.

See Also

istream class, wistream class

basic_istream::sentry class Sentry class for input streams

template <typename chT, typename traits=char_traits<chT> >
class basic_istream<chT,traits>::sentry{
  public: explicit sentry(basic_istream<chT,traits>& stream, 
                          bool noskipws = false);
  ~sentry(  );
  operator bool(  ) const;
private:
  sentry(const sentry&);            // Not defined
  sentry& operator=(const sentry&); // Not defined
};

A basic_istream object constructs a temporary sentry object prior to each input operation. The sentry object is destroyed when the input operation finishes and the function returns. The sentry manages tied streams and is responsible for skipping whitespace prior to a formatted read.

The stream passes itself and a flag to the sentry's constructor. Formatted reads (operator>>) use false for the second argument; unformatted reads (get, getline, etc.) use true.

If stream.good( ) is true, the sentry first flushes any tied stream. That is, if stream.tie( ) is not null, the sentry calls stream.tie( )->flush( ). This ensures that prompts and similar output appears before the input is requested. Then, if the noskipws argument is false, and if the skipws bit is not set in the stream's formatting flags ((ios_base::skipws & stream.fmtflags( )) == 0), the sentry's constructor reads and discards whitespace characters. The sentry uses code similar to that shown in Example 13-17.

Example

Example 13-17. Skipping whitespace in an input sentry
const std::ctype<char_type>& ctype =
  std::use_facet<ctype<char_type> >(stream.getloc(  ));
int_type c;
while ((c = stream.rdbuf(  )->snextc(  )) != traits::eof(  ))
  if (ctype.is(ctype.space,c) == 0) {
    // Put back the non-space character.
    stream.rdbuf(  )->sputbackc(c);
    break;
  }

If anything goes wrong, the sentry calls stream.setstate(failbit). The sentry's operator bool( ) returns true if stream.good( ) is true, and false otherwise.

See Also

basic_istream class template, basic_ostream::sentry in <ostream>

iostream class Narrow input and output stream

typedef basic_iostream<char> iostream;

The iostream class specializes basic_iostream for the char type.

See Also

basic_iostream class template, istream class, wiostream class, ostream in <ostream>

istream class Input stream

typedef basic_istream<char> istream;

The istream class specializes basic_istream for the char type.

See Also

basic_istream class template, iostream class, wistream class, ostream in <ostream>

operator>> function template Input operator for single characters

template<typename charT, typename traits>
  basic_istream<charT,traits>& operator>>
   (basic_istream<charT,traits>& stream, charT& c);
   
template<typename traits> basic_istream<char,traits>&
  operator>>(basic_istream<char,traits>& stream, unsigned char& c);
template<typename traits> basic_istream<char,traits>&
  operator>>(basic_istream<char,traits>& stream, signed char& c);

The operator>> function reads a character from an input stream using the rules for a formatted read (that is, a sentry object is constructed and initial whitespace is skipped). The character is stored in c. If no character is available, failbit is set. The return value is stream.

Note that the first form of operator>> reads the stream's character type. If the stream's character type is char, the second and third forms read signed char and unsigned char.

See Also

basic_istream class template

operator>> function template Input operator for character arrays

template<typename charT, typename traits>
  basic_istream<charT,traits>& operator>>
   (basic_istream<charT,traits>& stream, charT* str);
   
template<typename traits> basic_istream<char,traits>&
  operator>>(basic_istream<char,traits>& stream, unsigned char* str);
template<typename traits> basic_istream<char,traits>&
  operator>>(basic_istream<char,traits>& stream, signed char* str);

The operator>> function reads characters from stream into str. As with any formatted input, a sentry object is created and initial whitespace is skipped. Characters are then read from the stream into str until an end-of-file is reached or the next character read would be a whitespace character (the space is not read from the stream).

To limit the number of characters read (always a good idea), set the stream's width to n. At most, n - 1 characters will be read into s. The function resets the width to 0 after reading the stream. A null character is always appended to the end of the string.

If no characters are read from the stream, failbit is set.

Note that the first form of operator>> reads with the stream's character type. If the stream's character type is char, the second and third forms read signed char and unsigned char.

See Also

basic_istream class template

wiostream class Wide input and output stream

typedef basic_iostream<wchar_t> wiostream;

The wiostream class specializes basic_iostream for the wchar_t type.

See Also

basic_iostream class template, iostream class, wistream class, wostream in <ostream>

wistream class Wide input stream

typedef basic_istream<wchar_t> wistream;

The wistream class specializes basic_istream for the wchar_t type.

See Also

basic_istream class template, istream class, wiostream class, wostream in <ostream>

ws function Skips whitespace manipulator

template <class charT, class traits>
  basic_istream<charT,traits>& ws(basic_istream<charT,traits>& stream);

The ws function is an input stream manipulator that skips whitespace characters in stream using the same technique as basic_istream::sentry. If the manipulator reaches the end-of-file, it sets eofbit, but not failbit.

Example

Suppose you want to read a line of text by calling getline, but you also want to skip whitespace at the beginning of the line. (Because getline is an unformatted input function, it does not automatically skip whitespace.) The following example shows one way to skip whitespace and read the line using ws:

char buffer[BUFSIZ];
 . . . 
in >> ws;
in.getline(buffer, sizeof(buffer));

See Also

basic_istream class template, basic_istream::sentry class template

    Team LiB   Previous Section   Next Section