diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-07-20 22:31:49 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-07-21 13:08:43 +0200 |
| commit | 9abc3232a8c02f0fc6bef6ad0bad56a3804e6bc3 (patch) | |
| tree | 6e5e4ca81c2cad3dfe4f886059d5025c00e7e22c /lib/std/fs | |
| parent | f97c91ddb5ef600fce294c1bbd28e3f6f2185e5e (diff) | |
| download | zig-9abc3232a8c02f0fc6bef6ad0bad56a3804e6bc3.tar.gz zig-9abc3232a8c02f0fc6bef6ad0bad56a3804e6bc3.zip | |
std.fs.File.Reader: fix missed advance writer positions
Diffstat (limited to 'lib/std/fs')
| -rw-r--r-- | lib/std/fs/File.zig | 4 | ||||
| -rw-r--r-- | lib/std/fs/test.zig | 30 |
2 files changed, 32 insertions, 2 deletions
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); +} |
