diff --git a/vlib/os/file.c.v b/vlib/os/file.c.v index 3b659c897a..0e4e58b513 100644 --- a/vlib/os/file.c.v +++ b/vlib/os/file.c.v @@ -237,11 +237,18 @@ pub fn (f &File) read(mut buf []u8) !int { if buf.len == 0 { return IError(Eof{}) } - nbytes := fread(buf.data, 1, buf.len, f.cfile) or { - return IError(NotExpected{ - cause: 'unexpected error from fread' - code: -1 - }) + nbytes := int(C.fread(buf.data, 1, buf.len, f.cfile)) + // if no bytes were read, check for errors and end-of-file. + if nbytes <= 0 { + if C.feof(f.cfile) != 0 { + return IError(Eof{}) + } + if C.ferror(f.cfile) != 0 { + return IError(NotExpected{ + cause: 'unexpected error from fread' + code: -1 + }) + } } return nbytes } diff --git a/vlib/os/file_test.v b/vlib/os/file_test.v index fe4a1d9218..9582abbbca 100644 --- a/vlib/os/file_test.v +++ b/vlib/os/file_test.v @@ -144,7 +144,7 @@ fn test_read_eof_last_read_partial_buffer_fill() { assert false } else { // Expected an error when received end-of-file. - assert err !is none + assert err == IError(os.Eof{}) } f.close() } @@ -176,7 +176,7 @@ fn test_read_eof_last_read_full_buffer_fill() { assert false } else { // Expect an error at EOF. - assert err !is none + assert err == IError(os.Eof{}) } f.close() }