authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-02 11:34:31-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-02 11:34:31-04:00
log4eb68987d81cc4a1a92ebb4b5e83be73669801ad
tree39466f90958c64d12a5573e5f3346689e26d1aa0
parent2e5115b0687ee9b7078dbf70da7d7070a7c80399

std.io.readLine function

this provides a better input for guess number example. see #882

2 files changed, 24 insertions(+), 6 deletions(-)

example/guess_number/main.zig+7-6
......@@ -9,8 +9,6 @@ pub fn main() !void {
99 var stdout_file_stream = io.FileOutStream.init(&stdout_file);
1010 const stdout = &stdout_file_stream.stream;
1111
12 var stdin_file = try io.getStdIn();
13
1412 try stdout.print("Welcome to the Guess Number Game in Zig.\n");
1513
1614 var seed_bytes: [@sizeOf(u64)]u8 = undefined;
......@@ -27,12 +25,15 @@ pub fn main() !void {
2725 try stdout.print("\nGuess a number between 1 and 100: ");
2826 var line_buf : [20]u8 = undefined;
2927
30 const line_len = stdin_file.read(line_buf[0..]) catch |err| {
31 try stdout.print("Unable to read from stdin: {}\n", @errorName(err));
32 return err;
28 const line_len = io.readLine(line_buf[0..]) catch |err| switch (err) {
29 error.InputTooLong => {
30 try stdout.print("Input too long.\n");
31 continue;
32 },
33 error.EndOfFile, error.StdInUnavailable => return err,
3334 };
3435
35 const guess = fmt.parseUnsigned(u8, line_buf[0..line_len - 1], 10) catch {
36 const guess = fmt.parseUnsigned(u8, line_buf[0..line_len], 10) catch {
3637 try stdout.print("Invalid number.\n");
3738 continue;
3839 };
std/io.zig+17
......@@ -478,3 +478,20 @@ test "import io tests" {
478478 }
479479}
480480
481pub fn readLine(buf: []u8) !usize {
482 var stdin = getStdIn() catch return error.StdInUnavailable;
483 var adapter = FileInStream.init(&stdin);
484 var stream = &adapter.stream;
485 var index: usize = 0;
486 while (true) {
487 const byte = stream.readByte() catch return error.EndOfFile;
488 switch (byte) {
489 '\n' => return index,
490 else => {
491 if (index == buf.len) return error.InputTooLong;
492 buf[index] = byte;
493 index += 1;
494 },
495 }
496 }
497}