Help with file readers

in essence: i am trying to read a specific amount of bytes from a file.
i have been trying to update a library (rgbapng) to latest master but running into issues with how to use the file readers.

specifically, whenever i try to read into a buffer, when printing that buffer, it shows garbage data.

this is my latest frankenstein so far.

        const png_header: PngHeader = undefined;
        var read_buf: [25]u8 = @splat(0);
        var reader = file.reader(io, &read_buf);
        var allocating = std.Io.Writer.Allocating.init(std.heap.page_allocator);
        const writer = &allocating.writer;

        try reader.interface.streamExact(writer, 25);
        var buf = writer.buffered();
        std.log.debug("png header: {any}", .{@as(PngHeader, @bitCast(buf[0..25].*))});
        return png_header;

i also tried

    var reader = file.reader(io, &.{});
    try reader.interface.readSliceAll(buffer);
comptime {
    if (@sizeOf(PngHeader) != 25)
        @compileError("PngHeader must be exactly 25 bytes");
}

var buf: [25]u8 = undefined;

// readNoEof fills the entire buffer you pass to it.
// It returns error.EndOfStream if the file ends before the buffer is full.
try file.reader().readNoEof(buf[0..]);

// Requires PngHeader to be an extern/packed struct whose layout matches the file exactly.
const hdr: PngHeader = @bitCast(buf);

// PNG stores multi-byte integers in network byte order (big-endian).
// If PngHeader contains u16/u32 fields and you're on a little-endian CPU,
// you'll need to convert those fields (e.g. std.mem.bigToNative) after reading.
return hdr;

It’s not that readNoEof “bypasses buffered noise.” The main risks in the original approach were:

  • Returning an uninitialized value: png_header is undefined and never assigned, so return png_header; will always produce nonsense.

  • Layout / padding mismatch: if PngHeader isn’t extern/packed (and exactly 25 bytes), a @bitCast won’t line up with the bytes you read.

  • Slice / buffer mistakes: it’s easy to accidentally bitcast the wrong range or read into one buffer but print another when mixing Writer.Allocating, buffered(), and slicing.

Reading directly into a fixed [25]u8 and then interpreting it removes those moving parts and makes it obvious what bytes you actually got.