1.1 --- a/lib/posix/io.py Wed Dec 07 17:24:39 2016 +0100
1.2 +++ b/lib/posix/io.py Wed Dec 07 17:37:00 2016 +0100
1.3 @@ -51,18 +51,41 @@
1.4
1.5 "A system-level stream object."
1.6
1.7 - def __init__(self, fd, mode="r"):
1.8 + def __init__(self, fd, mode="r", bufsize=1024):
1.9
1.10 "Initialise the stream with the given 'fd' and 'mode'."
1.11
1.12 self.__data__ = fdopen(fd, mode)
1.13 + self.bufsize = bufsize
1.14
1.15 - def read(self, n):
1.16 + def read(self, n=0):
1.17
1.18 "Read 'n' bytes from the stream."
1.19
1.20 _check_int(n)
1.21 - return native._fread(self.__data__, n)
1.22 +
1.23 + # Read any indicated number of bytes.
1.24 +
1.25 + if n > 0:
1.26 + return native._fread(self.__data__, n)
1.27 +
1.28 + # Read all remaining bytes.
1.29 +
1.30 + else:
1.31 + l = []
1.32 +
1.33 + # Read until end-of-file.
1.34 +
1.35 + try:
1.36 + while True:
1.37 + l.append(native._fread(self.__data__, self.bufsize))
1.38 +
1.39 + # Handle end-of-file reads.
1.40 +
1.41 + except EOFError:
1.42 + pass
1.43 +
1.44 + return "".join(l)
1.45
1.46 def write(self, s):
1.47
2.1 --- a/templates/native.c Wed Dec 07 17:24:39 2016 +0100
2.2 +++ b/templates/native.c Wed Dec 07 17:37:00 2016 +0100
2.3 @@ -692,7 +692,7 @@
2.4
2.5 if (have_read != to_read)
2.6 {
2.7 - if (feof(f))
2.8 + if (feof(f) && (have_read == 0))
2.9 __raise_eof_error();
2.10 else if (error = ferror(f))
2.11 __raise_io_error(__new_int(error));
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/tests/read_stream.py Wed Dec 07 17:37:00 2016 +0100
3.3 @@ -0,0 +1,7 @@
3.4 +from sys import stdin
3.5 +
3.6 +s = stdin.read(10)
3.7 +print s
3.8 +
3.9 +s = stdin.read()
3.10 +print s
4.1 --- a/tests/testinput.txt Wed Dec 07 17:24:39 2016 +0100
4.2 +++ b/tests/testinput.txt Wed Dec 07 17:37:00 2016 +0100
4.3 @@ -1,1 +1,3 @@
4.4 Hello world!
4.5 +The rest of the file.
4.6 +More than one line.