diff --git a/lib/std/Io/File/Reader.zig b/lib/std/Io/File/Reader.zig index effd000df8..fb4c478695 100644 --- a/lib/std/Io/File/Reader.zig +++ b/lib/std/Io/File/Reader.zig @@ -309,7 +309,9 @@ fn discard(io_reader: *Io.Reader, limit: Io.Limit) Io.Reader.Error!usize { return 0; }; const logical_pos = logicalPos(r); - const delta = @min(@intFromEnum(limit), size - logical_pos); + const bytes_remaining = size - logical_pos; + if (bytes_remaining == 0) return error.EndOfStream; + const delta = @min(@intFromEnum(limit), bytes_remaining); setLogicalPos(r, logical_pos + delta); return delta; }, diff --git a/lib/std/Io/test.zig b/lib/std/Io/test.zig index 73931f9ea9..bd6b433d05 100644 --- a/lib/std/Io/test.zig +++ b/lib/std/Io/test.zig @@ -85,6 +85,28 @@ test "File.Writer.seekTo" { try expect(fw.logicalPos() == 1234); } +test "file discard" { + var tmp = tmpDir(.{}); + defer tmp.cleanup(); + + const io = testing.io; + + const tmp_file_name = "temp_test_file.txt"; + var file = try tmp.dir.createFile(io, tmp_file_name, .{ .read = true }); + defer file.close(io); + + var fw = file.writerStreaming(io, &.{}); + + try fw.interface.writeAll("test"); + + var fr = file.reader(io, &.{}); + const r = &fr.interface; + + try std.testing.expectEqual(error.EndOfStream, r.discardAll(1024)); + try fr.seekTo(0); + try std.testing.expectEqual(4, fr.interface.discardRemaining()); +} + test "File.setLength" { const io = testing.io;