[Issue 1106] New: Using Stream.readLine() and Stream.read(ubyte[])	requires understanding implementation details
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Fri Apr  6 10:56:35 PDT 2007
    
    
  
http://d.puremagic.com/issues/show_bug.cgi?id=1106
           Summary: Using Stream.readLine() and Stream.read(ubyte[])
                    requires understanding implementation details
           Product: D
           Version: 1.009
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: bugzilla at digitalmars.com
        ReportedBy: digitalmars-com at baysmith.com
There is a bug in the Stream class. If you mix, readLine() and read(ubyte[])
calls to a stream, readLine() may not appear to perform as documented. As
documented, readLine() stop at "some combination of carriage return [CR] and
line feed [LF]". However, this is not necessarily true. If the stream is
non-seekable, readLine() will stop at CR and set a prevCr flag indicating that
a LF should be consumed on the next read. However, this only takes place in the
getc() method and methods using getc(). Some methods, like read(ubyte[]), read
the stream directly and the prevCr flag is not processed.
At first, I thought this might just be odd behavior rather than a bug, but I
decided that it is a bug. In order to understand how to use the stream
effectively, one must understand the implementation details. One must know that
the behavior for seekable streams is different that non-seekable streams, and
adjust the client code accordingly. For this reason, it should be considered a
bug.
Code example:
import std.stream;
void main() {
  char[] testString = "line one\r\nline two\r\n";
  File testFile = new File("testFile", FileMode.OutNew);
  testFile.writeString(testString);
  testFile.close();
  File input = new File("testFile", FileMode.In);
  input.seekable = false;
  char[] line1 = input.readLine();
  assert(line1 == "line one");  // correct
  ubyte[1] b;
  input.read(b);
  assert(b[0] == '\n');  // incorrect
}
-- 
    
    
More information about the Digitalmars-d-bugs
mailing list