Browse Source

106 & 107

Alan CHUNG 1 year ago
parent
commit
223fc79e44
5 changed files with 100 additions and 20 deletions
  1. 8 1
      build.zig
  2. 4 5
      exercises/106_files.zig
  3. 52 0
      exercises/107_files2.zig
  4. 10 14
      patches/patches/106_files.patch
  5. 26 0
      patches/patches/107_files2.patch

+ 8 - 1
build.zig

@@ -1123,7 +1123,14 @@ const exercises = [_]Exercise{
     },
     .{
         .main_file = "106_files.zig",
-        .output = "Succefully wrote 18 bytes.",
+        .output = "Successfully wrote 18 bytes.",
+    },
+    .{
+        .main_file = "107_files2.zig",
+        .output =
+        \\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        \\Successfully Read 18 byte: It's zigling time!
+        ,
     },
     .{
         .main_file = "999_the_end.zig",

+ 4 - 5
exercises/106_files.zig

@@ -35,9 +35,7 @@ pub fn main() !void {
         // by doing nothing
         //
         // we want to catch error.PathAlreadyExists and do nothing
-        ??? => {
-            ???;
-        },
+        ??? => {},
         // if is any other unexpected error we just propagate it through
         else => return e,
     };
@@ -46,7 +44,8 @@ pub fn main() !void {
     // wait a minute
     // opening a directory might fail!
     // what should we do here?
-    const output_dir: std.fs.Dir = cwd.openDir("output", .{});
+    var output_dir: std.fs.Dir = cwd.openDir("output", .{});
+    defer output_dir.close();
 
     // we try to open the file `zigling.txt`,
     // and propagate the error up if there are any errors
@@ -60,7 +59,7 @@ pub fn main() !void {
 
     // !you are not allow to switch this two lines to before file closing line!
     const byte_written = try file.write("It's zigling time!");
-    std.debug.print("Succefully wrote {} bytes.\n", .{byte_written});
+    std.debug.print("Successfully wrote {} bytes.\n", .{byte_written});
 }
 // to check if you actually write to the file, you can either,
 // 1. open the file on your text editor, or

+ 52 - 0
exercises/107_files2.zig

@@ -0,0 +1,52 @@
+//
+// Prerequisite :
+//    - exercise/106_files.zig, or
+//    - create a file {project_root}/output/zigling.txt
+//      with content `It's zigling time!`(18 byte total)
+//
+// Now there no point in writing to a file if we don't read from it am I right?
+// let's wrote a program to read the content of the file that we just created.
+//
+// I am assuming you've created the appropriate files for this to work.
+//
+// Alright, bud, lean in close here's the game plan.
+//    - First, we open the {project_root}/output/ directory
+//    - Secondly, we open file `zigling.txt` in that directory
+//    - then, we initalize an array of character with all letter 'A', and print it
+//    - Afte that, we read the content of the file to the array
+//    - Finally, we print out the read content
+
+const std = @import("std");
+
+pub fn main() !void {
+    // Get the current working directory
+    const cwd = std.fs.cwd();
+
+    // try to open ./output assuming you did your 106_files exercise
+    var output_dir = try cwd.openDir("output", .{});
+    defer output_dir.close();
+
+    // try to open the file
+    const file = try output_dir.openFile("zigling.txt", .{});
+    defer file.close();
+
+    // initalize an array of u8 with all letter 'A'.
+    // we need to pick a size of the array, 64 seems like a good number.
+    // fix the initalization below
+    var content = ['A']*64;
+    // this should print out : `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`
+    std.debug.print("{s}\n", .{content});
+
+    // okay, seem like threat of violence is not the answer in this case
+    // can you go here to find a way to read the content ?
+    // https://ziglang.org/documentation/master/std/#std.fs.File
+    // hint: you might find two answer that are both vaild in this case
+    const byte_read = zig_read_the_file_or_i_will_fight_you(&content);
+
+    // Woah, too screamy, I know you're excited for zigling time but tone it down a bit
+    // Can you print only what we read from the file ?
+    std.debug.print("Successfully Read {} byte: {s}\n", .{
+        byte_read,
+        content, // change this line only
+    });
+}

+ 10 - 14
patches/patches/106_files.patch

@@ -1,28 +1,24 @@
---- exercises/106_files.zig
-+++ answers/106_files.zig
-@@ -35,9 +35,9 @@ pub fn main() !void {
+--- exercises/106_files.zig	2024-03-27 16:36:44.593077000 +0800
++++ answers/106_files.zig	2024-03-27 16:36:31.548155100 +0800
+@@ -35,7 +35,7 @@
          // by doing nothing
          //
          // we want to catch error.PathAlreadyExists and do nothing
--        ??? => {
--            ???;
--        },
-+        error.PathAlreadyExists => {
-+            return;
-+        },
+-        ??? => {},
++        error.PathAlreadyExists => {},
          // if is any other unexpected error we just propagate it through
          else => return e,
      };
-@@ -46,7 +46,7 @@ pub fn main() !void {
+@@ -44,7 +44,7 @@
      // wait a minute
      // opening a directory might fail!
      // what should we do here?
--    const output_dir: std.fs.Dir = cwd.openDir("output", .{});
-+    const output_dir: std.fs.Dir = try cwd.openDir("output", .{});
+-    var output_dir: std.fs.Dir = cwd.openDir("output", .{});
++    var output_dir: std.fs.Dir = try cwd.openDir("output", .{});
+     defer output_dir.close();
  
      // we try to open the file `zigling.txt`,
-     // and propagate the error up if there are any errors
-@@ -56,7 +56,7 @@ pub fn main() !void {
+@@ -55,7 +55,7 @@
      // but here we are not yet done writing to the file
      // if only there are a keyword in zig that
      // allow you "defer" code execute to the end of scope...

+ 26 - 0
patches/patches/107_files2.patch

@@ -0,0 +1,26 @@
+--- exercises/107_files2.zig	2024-03-27 16:36:56.733062700 +0800
++++ answers/107_files2.zig	2024-03-27 16:36:52.894505100 +0800
+@@ -33,7 +33,7 @@
+     // initalize an array of u8 with all letter 'A'.
+     // we need to pick a size of the array, 64 seems like a good number.
+     // fix the initalization below
+-    var content = ['A']*64;
++    var content = [_]u8{'A'} ** 64;
+     // this should print out : `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`
+     std.debug.print("{s}\n", .{content});
+ 
+@@ -41,12 +41,12 @@
+     // can you go here to find a way to read the content ?
+     // https://ziglang.org/documentation/master/std/#std.fs.File
+     // hint: you might find two answer that are both vaild in this case
+-    const byte_read = zig_read_the_file_or_i_will_fight_you(&content);
++    const byte_read = try file.read(&content);
+ 
+     // Woah, too screamy, I know you're excited for zigling time but tone it down a bit
+     // Can you print only what we read from the file ?
+     std.debug.print("Successfully Read {} byte: {s}\n", .{
+         byte_read,
+-        content, // change this line only
++        content[0..byte_read], // change this line only
+     });
+ }