HOWTO: Clear an istream Object During ExtractionLast reviewed: October 3, 1997Article ID: Q132422 |
The information in this article applies to:
SUMMARYTesting for errors during extraction is important. For example:
int n = 0; while (n <= 100) {cin >> n;}This program is expecting a value greater than 100. If the user inputs a non-numeric value, the stream's fail bit is set, and the cin object becomes unusable. All subsequent extractions result in an immediate return with no value stored. Consequently, the program hangs (stops responding) in the while loop.
MORE INFORMATIONThe clear() member function clears the fail bit. However, the istream object is still unusable. The sample code below clears the fail bit and extracts the unusable characters left in the streambuf object.
Sample Code
/* No special compile options needed. */ #include <iostream.h> int ClearError(istream& isIn) // Clears istream object { streambuf* sbpThis; char szTempBuf[20]; int nCount, nRet = isIn.rdstate(); if (nRet) // Any errors? { isIn.clear(); // Clear error flags sbpThis = isIn.rdbuf(); // Get streambuf pointer nCount = sbpThis->in_avail(); // Number of characters in buffer while (nCount) // Extract them to szTempBuf { if (nCount > 20) { sbpThis->sgetn(szTempBuf, 20); nCount -= 20; } else { sbpThis->sgetn(szTempBuf, nCount); nCount = 0; } } } return nRet; } void main() { int n = 0, nState; while (n <= 100) { cout << "Please enter an integer greater than 100.\n"; cin >> n; nState = ClearError(cin); // Clears any errors in cin } } REFERENCESiostream Class Library Reference, Chapter 1 Keywords : CPPLngIss CRTIss kbcode Version : MS-DOS:7.0;WIN3X:1.0,1.5,1.51,1.52;WINNT:2.0,2.1,4.0,5.0; Platform : MS-DOS NT WINDOWS Issue type : kbhowto |
================================================================================
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |