567 lines
16 KiB
C
567 lines
16 KiB
C
|
#ifndef __ISTREAM_H
|
|||
|
#define __ISTREAM_H
|
|||
|
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
|
|||
|
// -*- C++ -*-
|
|||
|
#ifndef __STD_ISTREAM__
|
|||
|
#define __STD_ISTREAM__
|
|||
|
|
|||
|
/***************************************************************************
|
|||
|
*
|
|||
|
* istream - Declarations for the Standard Library istreams
|
|||
|
*
|
|||
|
***************************************************************************
|
|||
|
*
|
|||
|
* Copyright (c) 1994-1999 Rogue Wave Software, Inc. All Rights Reserved.
|
|||
|
*
|
|||
|
* This computer software is owned by Rogue Wave Software, Inc. and is
|
|||
|
* protected by U.S. copyright laws and other laws and by international
|
|||
|
* treaties. This computer software is furnished by Rogue Wave Software,
|
|||
|
* Inc. pursuant to a written license agreement and may be used, copied,
|
|||
|
* transmitted, and stored only in accordance with the terms of such
|
|||
|
* license and with the inclusion of the above copyright notice. This
|
|||
|
* computer software or any other copies thereof may not be provided or
|
|||
|
* otherwise made available to any other person.
|
|||
|
*
|
|||
|
* U.S. Government Restricted Rights. This computer software is provided
|
|||
|
* with Restricted Rights. Use, duplication, or disclosure by the
|
|||
|
* Government is subject to restrictions as set forth in subparagraph (c)
|
|||
|
* (1) (ii) of The Rights in Technical Data and Computer Software clause
|
|||
|
* at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
|
|||
|
* Commercial Computer Software <EFBFBD> Restricted Rights at 48 CFR 52.227-19,
|
|||
|
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
|
|||
|
* Flatiron Parkway, Boulder, Colorado 80301 USA.
|
|||
|
*
|
|||
|
**************************************************************************/
|
|||
|
|
|||
|
#include <stdcomp.h>
|
|||
|
|
|||
|
#include <ios>
|
|||
|
#include <ostream>
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_NAMESPACE
|
|||
|
namespace std {
|
|||
|
#endif
|
|||
|
|
|||
|
extern istream _RWSTDExport cin;
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_WIDE_CHAR
|
|||
|
extern wistream _RWSTDExport wcin;
|
|||
|
#endif
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
class _RWSTDExportTemplate basic_istream : virtual public basic_ios<charT, traits>
|
|||
|
{
|
|||
|
|
|||
|
public:
|
|||
|
//
|
|||
|
// Types:
|
|||
|
//
|
|||
|
typedef charT 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;
|
|||
|
|
|||
|
typedef basic_istream<charT, traits> istream_type;
|
|||
|
typedef basic_ios<charT, traits> ios_type;
|
|||
|
typedef basic_streambuf<charT, traits> streambuf_type;
|
|||
|
|
|||
|
_EXPLICIT basic_istream(basic_streambuf<charT, traits> *sb);
|
|||
|
#if defined ( __SUNPRO_CC )
|
|||
|
_EXPLICIT basic_istream(EmptyCtor) : basic_ios<charT, traits>(1) {}
|
|||
|
#endif
|
|||
|
virtual ~basic_istream();
|
|||
|
|
|||
|
class sentry
|
|||
|
{
|
|||
|
public:
|
|||
|
|
|||
|
inline _EXPLICIT sentry(basic_istream<charT,traits>& stream,
|
|||
|
bool noskipws = 0)
|
|||
|
: __stream(stream)
|
|||
|
{
|
|||
|
#ifdef _RWSTD_MULTI_THREAD
|
|||
|
if ( stream.rdbuf() )
|
|||
|
__guard = new _RWSTDGuard(stream.rdbuf()->buffer_mutex_);
|
|||
|
#ifndef _RWSTD_NO_EXCEPTIONS
|
|||
|
try {
|
|||
|
#endif
|
|||
|
#endif // _RWSTD_MULTI_THREAD
|
|||
|
|
|||
|
if(!(stream.good()))
|
|||
|
{
|
|||
|
stream.setstate(ios_base::failbit);
|
|||
|
__ok = false;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if(stream.tie())
|
|||
|
stream.tie()->flush();
|
|||
|
|
|||
|
if(!noskipws && (stream.flags() & ios_base::skipws))
|
|||
|
{
|
|||
|
int_type c;
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
|
|||
|
const ctype<charT>& ct = use_facet< ctype<charT> >(stream.getloc());
|
|||
|
#else
|
|||
|
const ctype<charT>& ct = use_facet(stream.getloc(),(ctype<charT>*)0);
|
|||
|
#endif // _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
|
|||
|
|
|||
|
while((c = stream.rdbuf()->sgetc()),
|
|||
|
( !traits::eq_int_type(c,traits::eof()) && ct.is(ct.space,c) ))
|
|||
|
{
|
|||
|
stream.rdbuf()->snextc();
|
|||
|
}
|
|||
|
|
|||
|
if( traits::eq_int_type(c,traits::eof()) )
|
|||
|
{
|
|||
|
stream.setstate(ios_base::eofbit);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(!(stream.good()))
|
|||
|
{
|
|||
|
stream.setstate(ios_base::failbit);
|
|||
|
__ok = false;
|
|||
|
}
|
|||
|
else
|
|||
|
__ok =true;
|
|||
|
}
|
|||
|
#if defined (_RWSTD_MULTI_THREAD) && !defined (_RWSTD_NO_EXCEPTIONS)
|
|||
|
} catch(...)
|
|||
|
{
|
|||
|
if ( __stream.rdbuf() )
|
|||
|
delete __guard;
|
|||
|
throw;
|
|||
|
}
|
|||
|
#endif // _RWSTD_MULTI_THREAD etc.
|
|||
|
}
|
|||
|
|
|||
|
~sentry() {
|
|||
|
#ifdef _RWSTD_MULTI_THREAD
|
|||
|
if ( __stream.rdbuf() )
|
|||
|
delete __guard;
|
|||
|
#endif // _RWSTD_MULTI_THREAD
|
|||
|
}
|
|||
|
operator bool () { return __ok; }
|
|||
|
|
|||
|
private:
|
|||
|
basic_istream<charT,traits>& __stream;
|
|||
|
bool __ok;
|
|||
|
#ifdef _RWSTD_MULTI_THREAD
|
|||
|
_RWSTDGuard* __guard;
|
|||
|
#endif
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
istream_type& operator>>(istream_type& (*pf)(istream_type&));
|
|||
|
istream_type& operator>>(ios_base& (*pf)(ios_base&));
|
|||
|
istream_type& operator>>(ios_type& (*pf)(ios_type&));
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_BOOL
|
|||
|
istream_type& operator>>(bool& n);
|
|||
|
#endif
|
|||
|
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);
|
|||
|
#ifdef _RWSTD_LONG_LONG
|
|||
|
istream_type& operator>>(_RWSTD_LONG_LONG& n);
|
|||
|
istream_type& operator>>(unsigned _RWSTD_LONG_LONG& n);
|
|||
|
#endif
|
|||
|
istream_type& operator>>(void*& p);
|
|||
|
istream_type& operator>>(streambuf_type& sb);
|
|||
|
istream_type& operator>>(streambuf_type *sb);
|
|||
|
|
|||
|
int_type get()
|
|||
|
{
|
|||
|
ios_base::iostate err = 0;
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_EXCEPTIONS
|
|||
|
try {
|
|||
|
#endif
|
|||
|
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this,1);
|
|||
|
__chcount = 0;
|
|||
|
|
|||
|
if(ipfx)
|
|||
|
{
|
|||
|
int_type c = this->rdbuf()->sbumpc();
|
|||
|
|
|||
|
if( traits::eq_int_type(c,traits::eof()) )
|
|||
|
{
|
|||
|
err = ios_base::eofbit | ios_base::failbit;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
__chcount = 1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_EXCEPTIONS
|
|||
|
} // end of try block
|
|||
|
catch(...)
|
|||
|
{
|
|||
|
bool flag = false;
|
|||
|
try {
|
|||
|
this->setstate(ios_base::badbit);
|
|||
|
}
|
|||
|
catch( ios_base::failure ) { flag= true; }
|
|||
|
if ( flag ) throw;
|
|||
|
}
|
|||
|
#endif // _RWSTD_NO_EXCEPTIONS
|
|||
|
|
|||
|
if ( err ) this->setstate(err);
|
|||
|
|
|||
|
return traits::eof();
|
|||
|
}
|
|||
|
istream_type& get(char_type *s, streamsize n, char_type delim);
|
|||
|
istream_type& get(char_type *s, streamsize n)
|
|||
|
{ return get(s,n,this->widen('\n')); }
|
|||
|
|
|||
|
istream_type& get(char_type& c);
|
|||
|
|
|||
|
istream_type& get(streambuf_type& sb, char_type delim);
|
|||
|
istream_type& get(streambuf_type& sb)
|
|||
|
{ return get(sb,this->widen('\n')); }
|
|||
|
|
|||
|
istream_type& getline(char_type *s, streamsize n, char_type delim);
|
|||
|
istream_type& getline(char_type *s, streamsize n)
|
|||
|
{ return getline(s,n,this->widen('\n')); }
|
|||
|
|
|||
|
istream_type& ignore(streamsize n = 1, int_type delim = traits::eof());
|
|||
|
|
|||
|
istream_type& read(char_type *s, streamsize n);
|
|||
|
|
|||
|
streamsize readsome(char_type *s, streamsize n);
|
|||
|
|
|||
|
int_type peek();
|
|||
|
|
|||
|
pos_type tellg();
|
|||
|
|
|||
|
//
|
|||
|
// The seekg functions are inlined for portability
|
|||
|
//
|
|||
|
istream_type& seekg(pos_type pos)
|
|||
|
{
|
|||
|
ios_base::iostate err = 0;
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_EXCEPTIONS
|
|||
|
try {
|
|||
|
#endif
|
|||
|
if ( this->rdstate() & ios_base::eofbit )
|
|||
|
clear( this->rdstate() & ~ios_base::eofbit );
|
|||
|
|
|||
|
#ifdef _RWSTD_MULTI_THREAD
|
|||
|
if ( this->rdbuf() ) {
|
|||
|
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
|
|||
|
#endif // _RWSTD_MULTI_THREAD
|
|||
|
|
|||
|
// using fail will disable seek when at end of char buffer, bad() would work better
|
|||
|
if ( !this->fail() )
|
|||
|
this->rdbuf()->pubseekpos(pos, ios_base::in);
|
|||
|
|
|||
|
#ifdef _RWSTD_MULTI_THREAD
|
|||
|
}
|
|||
|
#endif // _RWSTD_MULTI_THREAD
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_EXCEPTIONS
|
|||
|
} // end of try block
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_EXCEPTIONS
|
|||
|
catch(...)
|
|||
|
{
|
|||
|
bool flag = false;
|
|||
|
try {
|
|||
|
this->setstate(ios_base::badbit);
|
|||
|
}
|
|||
|
catch( ios_base::failure ) { flag= true; }
|
|||
|
if ( flag ) throw;
|
|||
|
}
|
|||
|
#endif // _RWSTD_NO_EXCEPTIONS
|
|||
|
|
|||
|
return *this;
|
|||
|
}
|
|||
|
|
|||
|
istream_type& seekg(off_type off, ios_base::seekdir dir)
|
|||
|
{
|
|||
|
ios_base::iostate err = 0;
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_EXCEPTIONS
|
|||
|
try {
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef _RWSTD_MULTI_THREAD
|
|||
|
if ( this->rdbuf() ) {
|
|||
|
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
|
|||
|
#endif
|
|||
|
if ( !this->fail() )
|
|||
|
{
|
|||
|
this->rdbuf()->pubseekoff(off, dir, ios_base::in);
|
|||
|
}
|
|||
|
|
|||
|
#ifdef _RWSTD_MULTI_THREAD
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_EXCEPTIONS
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_EXCEPTIONS
|
|||
|
catch(...)
|
|||
|
{
|
|||
|
bool flag = false;
|
|||
|
try {
|
|||
|
this->setstate(ios_base::badbit);
|
|||
|
}
|
|||
|
catch( ios_base::failure ) { flag= true; }
|
|||
|
if ( flag ) throw;
|
|||
|
}
|
|||
|
#endif // _RWSTD_NO_EXCEPTIONS
|
|||
|
|
|||
|
return *this;
|
|||
|
}
|
|||
|
|
|||
|
int sync();
|
|||
|
|
|||
|
istream_type& putback(char_type c);
|
|||
|
|
|||
|
istream_type& unget();
|
|||
|
|
|||
|
streamsize gcount() const;
|
|||
|
|
|||
|
#ifdef _RWSTD_MULTI_THREAD
|
|||
|
_RWSTDGuard *istream_sentry_guard;
|
|||
|
#endif
|
|||
|
|
|||
|
protected:
|
|||
|
basic_istream( );
|
|||
|
|
|||
|
private:
|
|||
|
streamsize __chcount;
|
|||
|
};
|
|||
|
/*
|
|||
|
* Class basic_iostream
|
|||
|
*/
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
class _RWSTDExportTemplate basic_iostream : public basic_istream<charT, traits>,
|
|||
|
public basic_ostream<charT, traits>
|
|||
|
{
|
|||
|
public:
|
|||
|
_EXPLICIT basic_iostream(basic_streambuf<charT, traits> *sb);
|
|||
|
virtual ~basic_iostream();
|
|||
|
|
|||
|
protected:
|
|||
|
_EXPLICIT basic_iostream();
|
|||
|
};
|
|||
|
|
|||
|
//
|
|||
|
// istream iterator.
|
|||
|
//
|
|||
|
|
|||
|
#ifdef _RWSTD_NO_UNDEFINED_FRIEND
|
|||
|
|
|||
|
template <class T, class charT, class traits, class Distance>
|
|||
|
class _RWSTDExportTemplate istream_iterator;
|
|||
|
|
|||
|
template <class T, class charT, class traits, class Distance>
|
|||
|
bool operator==
|
|||
|
(const istream_iterator<T,charT,traits,Distance>& x,
|
|||
|
const istream_iterator<T,charT,traits,Distance>& y);
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
#if !defined(_MSC_VER) || defined(__BORLANDC__)
|
|||
|
template <class T, class charT, class traits, class Distance>
|
|||
|
#else
|
|||
|
template <class T, class charT=char, class traits=char_traits<charT>, class Distance=ptrdiff_t>
|
|||
|
#endif
|
|||
|
class _RWSTDExportTemplate istream_iterator
|
|||
|
: public iterator<input_iterator_tag,T,Distance,const T*, const T&>
|
|||
|
{
|
|||
|
#ifdef __TURBOC__
|
|||
|
friend inline bool (std::operator==) (
|
|||
|
const istream_iterator<T,charT,traits,Distance>& x,
|
|||
|
const istream_iterator<T,charT,traits,Distance>& y);
|
|||
|
#else
|
|||
|
friend inline bool operator== (
|
|||
|
const istream_iterator<T,charT,traits,Distance>& x,
|
|||
|
const istream_iterator<T,charT,traits,Distance>& y);
|
|||
|
#endif
|
|||
|
public:
|
|||
|
typedef charT char_type;
|
|||
|
typedef traits traits_type;
|
|||
|
typedef basic_istream<charT,traits> istream_type;
|
|||
|
typedef T value_type;
|
|||
|
|
|||
|
istream_iterator () : stream(&cin), end_marker(false) {}
|
|||
|
istream_iterator (basic_istream<charT,traits>& s) : stream(&s) { read(); }
|
|||
|
istream_iterator ( const istream_iterator<T,charT,traits,Distance>& x )
|
|||
|
: stream(x.stream) , value(x.value) , end_marker(x.end_marker)
|
|||
|
{ ; }
|
|||
|
const T& operator* () const { return value; }
|
|||
|
#ifndef _RWSTD_NO_NONCLASS_ARROW_RETURN
|
|||
|
const T* operator->() const { return &value; }
|
|||
|
#endif // _RWSTD_NO_NONCLASS_ARROW_RETURN
|
|||
|
istream_iterator<T,charT,traits,Distance>& operator++ ()
|
|||
|
{
|
|||
|
read();
|
|||
|
return *this;
|
|||
|
}
|
|||
|
istream_iterator<T,charT,traits,Distance> operator++ (int)
|
|||
|
{
|
|||
|
istream_iterator<T,charT,traits,Distance> tmp = *this;
|
|||
|
read();
|
|||
|
return tmp;
|
|||
|
}
|
|||
|
|
|||
|
protected:
|
|||
|
basic_istream<charT,traits>* stream;
|
|||
|
T value;
|
|||
|
bool end_marker;
|
|||
|
|
|||
|
void read ()
|
|||
|
{
|
|||
|
end_marker = (*stream) ? true : false;
|
|||
|
if (end_marker) *stream >> value;
|
|||
|
end_marker = (*stream) ? true : false;
|
|||
|
}
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
template <class T, class charT, class traits, class Distance>
|
|||
|
inline bool operator==
|
|||
|
(const istream_iterator<T,charT,traits,Distance>& x,
|
|||
|
const istream_iterator<T,charT,traits,Distance>& y)
|
|||
|
{
|
|||
|
return x.stream == y.stream && x.end_marker == y.end_marker ||
|
|||
|
x.end_marker == false && y.end_marker == false;
|
|||
|
}
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_NAMESPACE
|
|||
|
template <class T, class charT, class traits, class Distance>
|
|||
|
inline bool operator!=
|
|||
|
(const istream_iterator<T,charT,traits,Distance>& x,
|
|||
|
const istream_iterator<T,charT,traits,Distance>& y)
|
|||
|
{
|
|||
|
return !(x == y);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
basic_istream<charT, traits>& _RWSTDExportTemplate
|
|||
|
ws(basic_istream<charT, traits>& is);
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
|
|||
|
typedef basic_istream<char> istream;
|
|||
|
#else
|
|||
|
typedef basic_istream<char, char_traits<char> > istream;
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_WIDE_CHAR
|
|||
|
#ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
|
|||
|
typedef basic_istream<wchar_t> wistream;
|
|||
|
#else
|
|||
|
typedef basic_istream<wchar_t, char_traits<wchar_t> > wistream;
|
|||
|
#endif
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_DEFAULT_TEMPLATES
|
|||
|
typedef basic_iostream<char> iostream;
|
|||
|
#else
|
|||
|
typedef basic_iostream<char, char_traits<char> > iostream;
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_WIDE_CHAR
|
|||
|
#ifndef _RWSTD_NO_DEFAULT_TEMPLATES
|
|||
|
typedef basic_iostream<wchar_t> wiostream;
|
|||
|
#else
|
|||
|
typedef basic_iostream<wchar_t, char_traits<wchar_t> > wiostream;
|
|||
|
#endif
|
|||
|
#endif
|
|||
|
// charT and charT* extractors
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
basic_istream<charT, traits>& _RWSTDExportTemplate
|
|||
|
operator>> ( basic_istream<charT, traits>&, charT& );
|
|||
|
|
|||
|
template<class charT, class traits>
|
|||
|
basic_istream<charT, traits>& _RWSTDExportTemplate
|
|||
|
operator>> ( basic_istream<charT, traits>&, charT* );
|
|||
|
// signed and unsigned extractors
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_SIGNED_CHAR_IN_STREAMS
|
|||
|
template <class traits>
|
|||
|
basic_istream<char, traits>& _RWSTDExportTemplate
|
|||
|
operator>> ( basic_istream<char, traits>&, unsigned char& );
|
|||
|
|
|||
|
template <class traits>
|
|||
|
basic_istream<char, traits>& _RWSTDExportTemplate
|
|||
|
operator>> ( basic_istream<char, traits>&, signed char& );
|
|||
|
|
|||
|
template <class traits>
|
|||
|
basic_istream<char, traits>& _RWSTDExportTemplate
|
|||
|
operator>> ( basic_istream<char, traits>&, unsigned char* );
|
|||
|
|
|||
|
template <class traits>
|
|||
|
basic_istream<char, traits>& _RWSTDExportTemplate
|
|||
|
operator>> ( basic_istream<char, traits>&, signed char* );
|
|||
|
#endif
|
|||
|
|
|||
|
// String extractor and getline
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_NAMESPACE
|
|||
|
}
|
|||
|
namespace __rwstd {
|
|||
|
#endif
|
|||
|
|
|||
|
template <class streamT, class stringT, class traits>
|
|||
|
streamT& rw_extract_string(streamT& is, stringT& s, traits);
|
|||
|
|
|||
|
#ifndef _RWSTD_NO_NAMESPACE
|
|||
|
}
|
|||
|
namespace std {
|
|||
|
#endif
|
|||
|
|
|||
|
template<class charT, class traits, class Allocator>
|
|||
|
inline basic_istream<charT, traits>&
|
|||
|
operator>> (basic_istream<charT,traits>& is,
|
|||
|
basic_string<charT,traits,Allocator>& s)
|
|||
|
{
|
|||
|
return __RWSTD::rw_extract_string(is,s,traits());
|
|||
|
}
|
|||
|
|
|||
|
template<class charT, class traits, class Allocator>
|
|||
|
basic_istream<charT, traits>& _RWSTDExportTemplate
|
|||
|
getline( basic_istream<charT, traits>&,
|
|||
|
basic_string<charT, traits, Allocator>&,
|
|||
|
charT delim );
|
|||
|
|
|||
|
template<class charT, class traits, class Allocator>
|
|||
|
inline basic_istream<charT, traits>&
|
|||
|
getline( basic_istream<charT, traits>& is,
|
|||
|
basic_string<charT, traits, Allocator>& str )
|
|||
|
{ return getline(is,str,is.widen('\n')); }
|
|||
|
#ifndef _RWSTD_NO_NAMESPACE
|
|||
|
}
|
|||
|
#endif
|
|||
|
#ifdef _RWSTD_COMPILE_INSTANTIATE
|
|||
|
#include <istream.cc>
|
|||
|
#endif
|
|||
|
#endif // __STD__ISTREAM__
|
|||
|
#ifndef __USING_STD_NAMES__
|
|||
|
using namespace std;
|
|||
|
#endif
|
|||
|
|
|||
|
#pragma option pop
|
|||
|
#endif /* __ISTREAM_H */
|