Microsoft KB Archive/132422

= How To Clear an istream Object During Extraction =

Article ID: 132422

Article Last Modified on 6/29/2004

-

APPLIES TO

 The C Run-Time (CRT), when used with:  Microsoft C/C++ Professional Development System 7.0

 Microsoft Visual C++ 1.0 Professional Edition

 Microsoft Visual C++ 1.5 Professional Edition

 Microsoft Visual C++ 1.51</li></ul>

 Microsoft Visual C++ 1.52 Professional Edition</li></ul>

 Microsoft Visual C++ 1.0 Professional Edition</li></ul>

 Microsoft Visual C++ 2.0 Professional Edition</li></ul>

 Microsoft Visual C++ 2.1</li></ul>

 Microsoft Visual C++ 4.0 Standard Edition</li></ul>

 Microsoft Visual C++ 5.0 Enterprise Edition</li></ul>

 Microsoft Visual C++ 5.0 Professional Edition</li></ul>

 Microsoft Visual C++ 6.0 Enterprise Edition</li></ul>

<ul> <li>Microsoft Visual C++ 6.0 Professional Edition</li></ul>

<ul> <li>Microsoft Visual C++ 6.0 Standard Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q132422

<div class="summary_section">

SUMMARY
Testing 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.

<div class="moreinformation_section">

MORE INFORMATION
The 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 }  }

<div class="references_section">