From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14970 invoked by alias); 11 Mar 2002 21:35:43 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 14913 invoked by uid 61); 11 Mar 2002 21:35:41 -0000 Date: Mon, 11 Mar 2002 13:35:00 -0000 Message-ID: <20020311213541.14912.qmail@sources.redhat.com> To: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, paolo@gcc.gnu.org, pavenis@lanet.lv, salvador@inti.gov.ar From: pme@gcc.gnu.org Reply-To: pme@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, paolo@gcc.gnu.org, pavenis@lanet.lv, salvador@inti.gov.ar, gcc-gnats@gcc.gnu.org X-Mailer: gnatsweb 2.9.3 Subject: Re: libstdc++/4419: ifstream::get(buffer,len) stops reading when an empty line appears. X-SW-Source: 2002-03/txt/msg00351.txt.bz2 List-Id: Synopsis: ifstream::get(buffer,len) stops reading when an empty line appears. State-Changed-From-To: feedback->closed State-Changed-By: pme State-Changed-When: Mon Mar 11 13:35:41 2002 State-Changed-Why: The bug is in the user's code. The standard specifies that if no characters are extracted -- which is the case when calling get() on an empty line -- then the stream's failbit is set. The code should is not testing for failbit. Here is a modified testcase: #include const int maxLineLength=200; int main(void) { std::ifstream fileToView("4419.data"); char line[maxLineLength+1]; int len=0; //while(!fileToView.eof()) while(fileToView) { fileToView.get(line, sizeof line); char c; fileToView.get(c); // grab trailing newline printf("%d (%d)\n",strlen(line),c); // Sanity stop if (++len==20) return 1; } printf("EOF: %d\n",fileToView.eof()); printf("goodbit: %d\n",fileToView.good()); printf("failbit: %d\n",fileToView.fail()); printf("badbit: %d\n",fileToView.bad()); return 0; } Note the change in the while condition. Output is: 10 (10) 12 (10) 0 (10) EOF: 0 goodbit: 0 failbit: 1 badbit: 0 So the condition is being indicated, but the user was only testing for EOF, not for a general "stop" condition. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=4419