# fs.File and io.File

**URL:** <https://ziggit.dev/t/fs-file-and-io-file/13362>\
**Category:** Help\
**Tags:** language\
**Created:** [December 4, 2025, 7:48pm UTC](https://ziggit.dev/t/fs-file-and-io-file/13362 "2025-12-04T19:48:52Z")\
**Posts on this page:** 1\
**Showing post:** 5

<div class="post-metadata">

**Author:** ![jmctagger](https://ziggit.dev/letter_avatar_proxy/v4/letter/j/8dc957/32.png) [@jmctagger](https://ziggit.dev/u/jmctagger)\
**Post date:** [December 5, 2025, 4:05am UTC](https://ziggit.dev/t/fs-file-and-io-file/13362/5 "2025-12-05T04:05:26Z")

</div>

Ha! Now **that’s** horizontal-scrollbar-clear!

In this case, though there are some snippets in the release notes and elsewhere, I’d like critique on a couple of possible basic usage examples for reading a text file line-by-line assuming \n delimiters:

First, an allocator-less one that requires a big-enough buffer:

```zig
   const io = std.testing.io;
   var file = try std.Io.Dir.cwd().openFile(io, "test.txt", .{});
   defer file.close(io);
 
   var buf: [1024]u8 = undefined; // must be big enough for an entire line
   var reader: std.Io.File.Reader = file.reader(io, &buf);
   while(reader.interface.takeDelimiter('\n')) |line| {
      if (line) |l| { std.debug.print("line: {s}\n", .{l}); }
      else { break; }
   } else |err| return err;

```

Second, using Writer.Allocating:

```zig
   const io = std.testing.io;
   var file = try std.Io.Dir.cwd().openFile(io, "test.txt", .{});
   defer file.close(io);

   var gpa = std.heap.DebugAllocator(.{}){};
   defer _ = gpa.deinit();
   const alloc = gpa.allocator();

   var line = std.Io.Writer.Allocating.init(alloc);
   defer line.deinit();
   var buf: [1]u8 = undefined; // ridiculously small for illustration
   var reader: std.Io.File.Reader = file.reader(io, &buf);
   while(reader.interface.streamDelimiter(&line.writer, '\n')) |count| {
      _ = count;
      _ = reader.interface.toss(1);
      std.debug.print("line: {s}\n", .{line.written()});
      line.clearRetainingCapacity();
   } else |err| switch (err) {
      error.EndOfStream => {}, // while loop done
      error.WriteFailed, error.ReadFailed => |e| return e,
   }
   if (line.written().len > 0) {
      std.debug.print("tail: {s}\n", .{line.written()});
   }

```

Please criticize without reservation. I’m not suggesting it’s a model.

---

_[View the full topic](https://ziggit.dev/t/fs-file-and-io-file/13362)._
