aboutsummaryrefslogtreecommitdiff
path: root/lib/std/fs
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-07-20 22:31:49 -0700
committerAndrew Kelley <andrew@ziglang.org>2025-07-21 13:08:43 +0200
commit9abc3232a8c02f0fc6bef6ad0bad56a3804e6bc3 (patch)
tree6e5e4ca81c2cad3dfe4f886059d5025c00e7e22c /lib/std/fs
parentf97c91ddb5ef600fce294c1bbd28e3f6f2185e5e (diff)
downloadzig-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.zig4
-rw-r--r--lib/std/fs/test.zig30
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);
+}