NAME istream - formatted and unformatted input SYNOPSIS #include <iostream.h> typedef long streampos; typedef long streamoff; class unsafe_ios { public: // exported types // stream operation mode enum open_mode { in = 0x01, // open for reading out = 0x02, // open for writing ate = 0x04, // seek to eof upon original open app = 0x08, // append mode: all additions at eof trunc = 0x10, // truncate file if already exists nocreate = 0x20, // open fails if file doesn't exist noreplace= 0x40 // open fails if file already exists }; // stream seek direction enum seek_dir { beg=0, cur=1, end=2 }; // formatting flags enum { skipws = 0x0001, // skip whitespace on input left = 0x0002, // left-adjust output right = 0x0004, // right-adjust output internal = 0x0008, // padding after sign or base indicator dec = 0x0010, // decimal conversion oct = 0x0020, // octal conversion hex = 0x0040, // hexidecimal conversion showbase = 0x0080, // use base indicator on output showpoint = 0x0100, // force decimal point (floating output) uppercase = 0x0200, // upper-case hex output showpos = 0x0400, // add '+' to positive integers scientific= 0x0800, // use 1.2345E2 floating notation fixed = 0x1000, // use 123.45 floating notation unitbuf = 0x2000, // flush all streams after insertion stdio = 0x4000 // flush stdout, stderr after insertion }; // see ios(3C++) for remainder ... }; class unsafe_istream : virtual public unsafe_ios { public: // exported functions // unformatted input functions unsafe_istream& read(char* ptr, int count); unsafe_istream& read(unsigned char* ptr, int count); unsafe_istream& get(char* ptr, int count, char delim='\n'); unsafe_istream& get(streambuf& sbuf, char delim='\n'); unsafe_istream& get(char& ch); unsafe_istream& get(unsigned char& ch); unsafe_istream& get_line (char *ptr, int count, char delim='\n'); unsafe_istream& get_line (unsigned char *ptr, int count, char delim='\n'); int get(); int peek(); unsafe_istream& ignore(int count=1, int delim=EOF); unsafe_istream& putback(char ch); // wide character unsafe_istream& get(wchar_t* wptr, int count, wchar_t wdelim=L'\n'); unsafe_istream& get(wchar_t& wc); unsafe_istream& getline(wchar_t* wptr, int count, wchar_t wdelim=L'\n'); unsafe_istream& wignore(count=1, wdelim=WEOF); // other functions int ipfx(int noform=0); int wipfx(int noform=0); // wide character ipfx unsafe_istream& seekg(streampos pos); unsafe_istream& seekg(streamoff offset, unsafe_ios::seek_dir dir); streampos tellg(); int sync(); int gcount(); public: // exported operator functions unsafe_istream& operator>> (char* buf); unsafe_istream& operator>> (unsigned char* buf); unsafe_istream& operator>> (char&); unsafe_istream& operator>> (unsigned char&); unsafe_istream& operator>> (short&); unsafe_istream& operator>> (int&); unsafe_istream& operator>> (long&); unsafe_istream& operator>> (unsigned short&); unsafe_istream& operator>> (unsigned int&); unsafe_istream& operator>> (unsigned long&); unsafe_istream& operator>> (float&); unsafe_istream& operator>> (double&); unsafe_istream& operator>> (streambuf* sbufp); unsafe_istream& operator>> (unsafe_istream& (*manip)(unsafe_istream&)); unsafe_istream& operator>> (unsafe_ios& (*manip)(unsafe_ios&) ); public: // wide character unsafe_istream& operator>>(wchar_t&); unsafe_istream& operator>>(wchar_t*); public: // exported constructors unsafe_istream(streambuf* sbuf); }; class istream : virtual public ios, public unsafe_istream { public: //exported functions // unformatted input functions istream& read(char* ptr, int count); istream& read(unsigned char* ptr, int count); istream& get(char* ptr, int count, char delim='\n'); istream& get(unsigned char* ptr,int count, char delim='\n'); istream& get(unsigned char& ch); istream& get(char& ch); istream& get(streambuf& sb, char delim ='\n'); istream& getline(char* ptr, int count, char delim='\n'); istream& getline(unsigned char* ptr, int count, char delim='\n'); int get(); int peek(); istream& ignore(int len=1,int delim=EOF); istream& putback(char ch); // wide character istream& get(wchar_t* wptr, int count, wchar_t wdelim=L'\n'); istream& get(wchar_t& wc); istream& getline(wchar_t* wptr, int count, wchar_t wdelim=L'\n'); istream& wignore(int count=1, wchar_t wdelim=WEOF); wint_t peekw(); // other functions int ipfx(int noform=0); istream& seekg(streampos pos); istream& seekg(streamoff offset, seek_dir dir); streampos tellg(); int sync(); int gcount(); public: // exported operator functions istream& operator>>(char*); istream& operator>>(unsigned char*); istream& operator>>(char&); istream& operator>>(unsigned char&); istream& operator>>(short&); istream& operator>>(int&); istream& operator>>(long&); istream& operator>>(unsigned short&); istream& operator>>(unsigned int&); istream& operator>>(unsigned long&); istream& operator>>(float&); istream& operator>>(double&); istream& operator>>(streambuf*); istream& operator>>(istream& (*)(istream&)); istream& operator>>(ios& (*)(ios&)); public: // wide character istream& operator>>(wchar_t&); istream& operator>>(wchar_t*); public: // exported constructors istream(streambuf*); }; class istream_withassign : public istream { public: istream_withassign(); istream_withassign& operator= (istream&); istream_withassign& operator= (streambuf*); }; extern istream_withassign cin; ios& dec(ios&); ios& hex(ios&); ios& oct(ios&); istream& ws(istream&); unsafe_ios& dec(unsafe_ios&) ; unsafe_ios& hex(unsafe_ios&) ; unsafe_ios& oct(unsafe_ios&) ; unsafe_istream& ws(unsafe_istream&) ; DESCRIPTION Class istream supports formatted and unformatted extraction (input) of data from an associated streambuf. The istream object and its member functions are protected against access by multiple threads by mutex locks. The unsafe_istream object and its member functions do not imple- ment mutex locking. Aside from this difference, the func- tionality of istream and unsafe_istream and their respective member functions is identical. For more information on mt- safety, mutex locks and how these relate to iostreams objects, see the "MT-Safe libC Programmers Guide". ENVIRONMENT The discussion about thread safety applies only to Solaris 2.x. On Solaris 1.x the ``safe'' and ``unsafe'' functions behave identically. The wide character functions discussed are supported only on Solaris 2.x. Constructors and Assignment istream(sbufp) Associates the streambuf pointed to by sbufp with the stream and initializes the ios state. istream_withassign() Performs no initialization. istream_withassign isw = sbufp Associates the streambuf pointed to by sbufp with isw and completely initializes isw. istream_withassign isw = istr The streambuf associated with istr becomes associated with isw and the constructor completely initializes isw. About wide character operations Input functions that produce wide character results set failbit if they encounter an illegal sequence of bytes. A sequence of bytes is considered illegal if the input func- tion cannot interpret it as multibyte encoding of characters in the current locale. Do not directly follow a multibyte input operation that may peek ahead with a single-byte input operation. A single- byte input operation is allowable after a seek (seekg). streambufs need only support peeking one byte ahead, so mul- tibyte input operations that peek may buffer "peeked" bytes in the istream itself. seekg and tellg take account of any such internal buffering. Input prefix function int i = istr.ipfx(noform) Performs setup common to all extraction operations. Formatted extractors call ipfx(0); unformatted extrac- tors call ipfx(1). If the error state of istr is non- zero, ipfx returns zero immediately. If a stream is tied to istr (see tie in ios(3C++)) and noform is zero, the tied stream is flushed. If the skipws flag is set for the stream and noform is zero, leading whitespace characters (as defined by iswhite, see ctype(3V)), are skipped. Function ipfx returns zero if any error con- dition is encountered, non-zero otherwise. int i = istr.wipfx(noform) Wide character extractors use wipfx in place of ipfx. This is similar to ipfx(), but wipfx() skips over any multibyte space as defined by iswspace where ipfx skips over single-byte space characters. Furthermore wipfx() sets ios::failbit if encounters an illegal sequence of bytes. This function is not in the proposed ANSI ios- treams interface, so avoid calling it directly from application code. Formatted input (extraction) functions These call ipfx(0). If it returns zero, no further action takes place. Otherwise, leading whitespace will be stripped if ios::skipws is set. If only whitespace is left in the istream, no characters will then remain and the ios::failbit will be set. Wide character formatted input functions call wipfx(0) and return with no further action if it returns zero. istr >> sbufp Extracts characters from istr and inserts them into the streambuf pointed to by sbufp. This function always returns a reference to istr. You can use this function to copy a stream efficiently, but you should be sure that neither stream is tied. For example: #include <iostream.h> main() { // copy cin to cout cin.tie(0); cout.tie(0); cin >> cout.rdbuf(); // see ios(3C++) for rdbuf return 0; } istr >> x Extracts characters from istr and converts them accord- ing to the type of x. If ipfx returns zero, no charac- ters are extracted and x is unchanged. Any errors encountered are recorded in the error state of istr. In general, ios::failbit means that the next available characters were not suitable for the type; for example, leading letters for a numeric type, or leading whi- tespace for any type. The offending characters are not extracted. In general, ios::badbit means that no char- acters could be extracted; for example, attempting to extract past the end of file. These functions always return a reference to istr. User-written functions should be of the form istream& operator>> (istream&, SomeType) and should conform to these principles. The type of x and the format state of the istream (see ios(3C++) determine the details of the extraction and conversion. These functions do not change the state of the istream, except that the width variable is reset to zero after each formatted extraction. The predefined formatted extractors are as follows: char&, unsigned char& Extracts one character and stores it in x. wchar_t& Extracts one multibyte character and stores it in x as a wide character if wipfx(0) succeeds and it does not encounter end-of- file. Sets ios::failbit if it encounters an illegal sequence of bytes. short&, unsigned short& int&, unsigned int& long&, unsigned long& Extracts characters and converts them to an integral value according to the conversion base in the istream's format flags, and stores the value in x. The first character may be a plus (`+') or minus (`-') sign. The characters are then treated as decimal, octal, or hexa- decimal, if the ios::basfield flags are dec, oct, or hex, respectively. If none of these flags is set, the number is interpreted in the same way as integer con- stants in C++. That is, if the first two characters are ``0x'' or ``0X'' the base is hex; otherwise, if the first character is `0' the base is octal; otherwise the base is decimal. Extraction (and thus conversion) stops with the first non-digit, which is not extracted. Valid digits are `0'-`7' for octal, `0'-`9' for decimal, and `0'-`9', `a'-`f', `A'-`F' for hexadecimal. The error flag ios::failbit is set if no valid digits are encountered. A ``0x'' followed by a non-digit is an error. In the case of an error, the value of x is not changed. float&, double& Extracts characters and converts them to a floating- point value according to the C++ rules for floating- point constants, and stores the value in x. The error flag ios::failbit is set if the characters extracted do not begin a well-formed floating-point number; some characters may be extracted in this case, depending on at what point the error is detected. In the case of an error, the value of x is not changed. char*, unsigned char* Extracts characters and stores them in the array pointed to by x until a whitespace character is encoun- tered. The whitespace is not extracted (but ipfx may have discarded leading whitespace). If the width for- matting variable (see ios(3C++)) is non-zero, at most width-1 characters are extracted. A terminating null (0) is always stored in x, even when nothing is extracted. The error flag ios::failbit is set if no characters are available for extraction. wchar_t* Behaves like the extractor for char* except it decodes characters in multibyte representation into an array of wide characters until it encounters a multibyte whi- tespace character. In addition sets ios::failbit if it encounters an illegal sequence of bytes. Unformatted input (extraction) functions These call ipfx(1). If it returns zero, no further action takes place. Leading whitespace is not skipped, and no conversions take place. Wide character input functions call wipfx(1) in place of ipfx(1). int c = istr.get() Extracts the next character from istr and returns it. Returns EOF if no more characters are available; never sets ios::failbit. istr.get(ch) Extracts the next character from istr and stores it in ch. Stores EOF if no more characters are available; sets ios::failbit when attempting to extract beyond EOF. This function always returns a reference to istr. istr.get(ptr, count, delim) Extracts characters from istr and stores them in the char array beginning at ptr. Extraction stops after count-1 characters have been extracted or when a char- acter matching delim is encountered, whichever happens first. If a delim character is encountered, it is not extracted or stored. This function always stores a terminating null (0) even if nothing is extracted. It sets ios::failbit only if EOF is encountered before any characters are stored. This function always returns a reference to istr. istr.get(sbuf, delim) Extracts characters from istr and stores them in the streambuf sbuf. Extraction stops when a character matching delim (or EOF) is encountered, or when a store into sbuf fails, whichever happens first. If a delim character is encountered, it is not extracted or stored. If delim is EOF, extraction stops only when input is exhausted or when a store fails. This func- tion sets ios::failbit only if a store into sbuf fails; it always returns a reference to istr. istr.get(wc) Extracts the next character from istr and stores it in wc in its wide character representation. Stores WEOF if no more characters are available; sets ios::failbit when attempting to extract beyond end of file or if it encounters an illegal sequence of bytes. Returns a reference to istr. istr.get(wptr, count, wdelim) Same as for single-byte characters, but wptr points to an array of wchar_t and wdelim is of type wchar_t. Sets ios::failbit if it encounters an illegal sequence of bytes. Returns a reference to istr. istr.getline(ptr, count, delim) This function does the same thing as istr.get(ptr, count, delim), except that delim, if encountered, is extracted but not stored. Once count-1 characters have been extracted, the next character is left in istr, even if it is delim. This function always returns a reference to istr. istr.getline(wptr, count, wdelim) As for single-byte characters, but wptr points to an array of wchar_t and wdelim is of type wchar_t. Sets ios::failbit if it encounters an illegal sequence of bytes. Returns a reference to istr. istr.ignore(count, delim) Extracts characters from istr and discards them. Extraction stops when a character matching delim is encountered, when count characters have been extracted, or when EOF is encountered, whichever happens first; the delim character is extracted. If delim is EOF, all of the input is discarded. This function always returns a reference to istr. istr.wignore(count=1, wdelim=WEOF) As for ignore(), but if wdelim is not WEOF, count indi- cates the number of multibyte characters to skip rather than the number of bytes to skip. Even if wdelim is WEOF, sets ios::failbit and stops if it encounters an illegal sequence of bytes. Returns a reference to istr. istr.read(ptr, count) Extracts characters from istr and stores them in the char array beginning at ptr. Extraction stops after count characters have been extracted or when EOF is encountered, whichever happens first. This function sets ios::failbit if EOF is encountered before count characters are extracted; it always returns a reference to istr. The number of characters extracted can be found by calling istr.gcount(). (See below.) Positioning functions These deal with the get pointer of the streambuf associated with an istream. See .BR sbufpub (3C++) for a complete dis- cussion. Multibyte input operations may cause the get pointer of the streambuf to differ from the value reported by tellg(), but seeks done on the istream itself will still coordinate correctly with all operations on the istream. istr.seekg(pos) Sets the position of the get pointer; returns istr. istr.seekg(offset, dir) Sets the position of the get pointer; returns istr. streampos pos = istr.tellg() Returns the current position of the get pointer. Mul- tibyte input operations may cause the get pointer of the streambuf to differ from the value reported by tellg(), but seeks done on the istream rather than the streambuf will still coordinate correctly with all operations on the istream. Miscellaneous functions int i = istr.gcount() Returns the number of characters extracted from istr by the last unformatted input function. Note: Formatted input functions might call unformatted functions, thus changing the count. After an unformatted wide charac- ter input function, gcount() returns the number of (multibyte) characters extracted. int i = istr.peek() First calls istr.ipfx(1). If ipfx returns zero or if istr is at EOF, it returns EOF. Otherwise, it returns the next character without extracting it. int i = istr.peekw() Calls wipfx(1) and returns (wint_t)WEOF if that fails. Sets ios::failbit and returns WEOF if it encounters an illegal sequence of bytes. If successful, returns the next character in the stream as a wide character without moving past it. istr.putback(ch) If istr.fail() returns non-zero, this function returns without doing anything. Otherwise, it attempts to back up the streambuf associated with istr by pushing back character ch. Because it does no extraction, it does not call ipfx. It may fail, setting ios::failbit. In general, c must match the character ahead of the streambuf's get pointer (normally the last character extracted) - input might be coming from a read-only in-memory buffer. int i = istr.sync() Forces a correspondence between the internal data structures and the external source of characters in an implementation-defined manner. It calls the virtual function istr.rdbuf()->sync(), which of course will depend on the actual type of the buffer class. It returns EOF on error. Predefined Manipulators A manipulator may be used apparently as an inserted or extracted object, but many only change the state of the stream. See manip(3C++) and ios(3C++) for more information. Several manipulators are predefined for use with istreams. istr >> manip This is equivalent to the call manip(istr). istr >> dec This sets the conversion base of istr to 10. istr >> oct This sets the conversion base of istr to 8. istr >> hex This sets the conversion base of istr to 16. istr >> ws This extracts and discards consecutive whitespace char- acters from istr. SEE ALSO ios.intro(3C++), ctype(3V), ios(3C++), manip(3C++), sbufpub(3C++), stdiobuf(3C++), MT-Safe libC Programmer's Guide, Iostreams Tutorial.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |