diff --git a/lib/std/Io/Writer.zig b/lib/std/Io/Writer.zig index 09a1c8f81b..0723073592 100644 --- a/lib/std/Io/Writer.zig +++ b/lib/std/Io/Writer.zig @@ -440,7 +440,8 @@ pub fn advance(w: *Writer, n: usize) void { /// After calling `writableVector`, this function tracks how many bytes were /// written to it. pub fn advanceVector(w: *Writer, n: usize) usize { - return consume(w, n); + if (w.vtable != VectorWrapper.vtable) advance(w, n); + return n; } /// The `data` parameter is mutable because this function needs to mutate the diff --git a/lib/std/fs/File.zig b/lib/std/fs/File.zig index 37d40a885a..5b7e0aa570 100644 --- a/lib/std/fs/File.zig +++ b/lib/std/fs/File.zig @@ -1430,7 +1430,7 @@ pub const Reader = struct { return error.EndOfStream; } r.pos += n; - return n; + return w.advanceVector(n); }, .streaming_reading => { if (is_windows) { @@ -1453,7 +1453,7 @@ pub const Reader = struct { return error.EndOfStream; } r.pos += n; - return n; + return w.advanceVector(n); }, .failure => return error.ReadFailed, } diff --git a/lib/std/fs/test.zig b/lib/std/fs/test.zig index ece7f79a74..50cbccf270 100644 --- a/lib/std/fs/test.zig +++ b/lib/std/fs/test.zig @@ -2071,3 +2071,33 @@ test "invalid UTF-8/WTF-8 paths" { } }.impl); } + +test "read file non vectored" { + var tmp_dir = std.testing.tmpDir(.{}); + defer tmp_dir.cleanup(); + + const contents = "hello, world!\n"; + + const file = try tmp_dir.dir.createFile("input.txt", .{ .read = true }); + defer file.close(); + { + var file_writer: std.fs.File.Writer = .init(file, &.{}); + try file_writer.interface.writeAll(contents); + try file_writer.interface.flush(); + } + + var file_reader: std.fs.File.Reader = .init(file, &.{}); + + var write_buffer: [100]u8 = undefined; + var w: std.Io.Writer = .fixed(&write_buffer); + + var i: usize = 0; + while (true) { + i += file_reader.interface.stream(&w, .limited(3)) catch |err| switch (err) { + error.EndOfStream => break, + else => |e| return e, + }; + } + try std.testing.expectEqualStrings(contents, w.buffered()); + try std.testing.expectEqual(contents.len, i); +}