Commit b0d2ebe529
lib/std/io.zig
@@ -790,73 +790,6 @@ pub const BufferedAtomicFile = struct {
}
};
-pub fn readLine(buf: *std.Buffer) ![]u8 {
- var stdin_stream = getStdIn().inStream();
- return readLineFrom(&stdin_stream.stream, buf);
-}
-
-/// Reads all characters until the next newline into buf, and returns
-/// a slice of the characters read (excluding the newline character(s)).
-pub fn readLineFrom(stream: var, buf: *std.Buffer) ![]u8 {
- const start = buf.len();
- while (true) {
- const byte = try stream.readByte();
- switch (byte) {
- '\r' => {
- // trash the following \n
- _ = try stream.readByte();
- return buf.toSlice()[start..];
- },
- '\n' => return buf.toSlice()[start..],
- else => try buf.appendByte(byte),
- }
- }
-}
-
-test "io.readLineFrom" {
- var buf = try std.Buffer.initSize(testing.allocator, 0);
- defer buf.deinit();
- var mem_stream = SliceInStream.init(
- \\Line 1
- \\Line 22
- \\Line 333
- );
- const stream = &mem_stream.stream;
-
- testing.expectEqualSlices(u8, "Line 1", try readLineFrom(stream, &buf));
- testing.expectEqualSlices(u8, "Line 22", try readLineFrom(stream, &buf));
- testing.expectError(error.EndOfStream, readLineFrom(stream, &buf));
- testing.expectEqualSlices(u8, "Line 1Line 22Line 333", buf.toSlice());
-}
-
-pub fn readLineSlice(slice: []u8) ![]u8 {
- var stdin_stream = getStdIn().inStream();
- return readLineSliceFrom(&stdin_stream.stream, slice);
-}
-
-/// Reads all characters until the next newline into slice, and returns
-/// a slice of the characters read (excluding the newline character(s)).
-pub fn readLineSliceFrom(stream: var, slice: []u8) ![]u8 {
- // We cannot use Buffer.fromOwnedSlice, as it wants to append a null byte
- // after taking ownership, which would always require an allocation.
- var buf = std.Buffer{ .list = std.ArrayList(u8).fromOwnedSlice(testing.failing_allocator, slice) };
- try buf.resize(0);
- return try readLineFrom(stream, &buf);
-}
-
-test "io.readLineSliceFrom" {
- var buf: [7]u8 = undefined;
- var mem_stream = SliceInStream.init(
- \\Line 1
- \\Line 22
- \\Line 333
- );
- const stream = &mem_stream.stream;
-
- testing.expectEqualSlices(u8, "Line 1", try readLineSliceFrom(stream, buf[0..]));
- testing.expectError(error.OutOfMemory, readLineSliceFrom(stream, buf[0..]));
-}
-
pub const Packing = enum {
/// Pack data to byte alignment
Byte,
test/standalone/guess_number/main.zig
@@ -5,6 +5,7 @@ const fmt = std.fmt;
pub fn main() !void {
const stdout = &io.getStdOut().outStream().stream;
+ const stdin = io.getStdIn();
try stdout.print("Welcome to the Guess Number Game in Zig.\n", .{});
@@ -22,13 +23,12 @@ pub fn main() !void {
try stdout.print("\nGuess a number between 1 and 100: ", .{});
var line_buf: [20]u8 = undefined;
- const line = io.readLineSlice(line_buf[0..]) catch |err| switch (err) {
- error.OutOfMemory => {
- try stdout.print("Input too long.\n", .{});
- continue;
- },
- else => return err,
- };
+ const amt = try stdin.read(&line_buf);
+ if (amt == line_buf.len) {
+ try stdout.print("Input too long.\n", .{});
+ continue;
+ }
+ const line = std.mem.trimRight(u8, line_buf[0..amt], "\r\n");
const guess = fmt.parseUnsigned(u8, line, 10) catch {
try stdout.print("Invalid number.\n", .{});