From c7cd286be9d4ede3129a309e2668686be4646f07 Mon Sep 17 00:00:00 2001 From: Mitja Felicijan Date: Thu, 19 Sep 2024 14:01:34 +0200 Subject: Added saving of struct to file in Zig and reading it back --- README.md | 3 ++- zig-struct-bin/Makefile | 2 ++ zig-struct-bin/main.zig | 35 +++++++++++++++++++++++++++++++++++ zig-struct-bin/out.bin | Bin 0 -> 8 bytes zig-struct-json/Makefile | 7 +++++++ zig-struct-json/player.json | 1 + zig-struct-json/player.zig | 6 ++++++ zig-struct-json/read.zig | 23 +++++++++++++++++++++++ zig-struct-json/write.zig | 19 +++++++++++++++++++ zig-structs/Makefile | 7 ------- zig-structs/player.json | 1 - zig-structs/player.zig | 6 ------ zig-structs/read.zig | 23 ----------------------- zig-structs/write.zig | 19 ------------------- 14 files changed, 95 insertions(+), 57 deletions(-) create mode 100644 zig-struct-bin/Makefile create mode 100644 zig-struct-bin/main.zig create mode 100644 zig-struct-bin/out.bin create mode 100644 zig-struct-json/Makefile create mode 100644 zig-struct-json/player.json create mode 100644 zig-struct-json/player.zig create mode 100644 zig-struct-json/read.zig create mode 100644 zig-struct-json/write.zig delete mode 100644 zig-structs/Makefile delete mode 100644 zig-structs/player.json delete mode 100644 zig-structs/player.zig delete mode 100644 zig-structs/read.zig delete mode 100644 zig-structs/write.zig diff --git a/README.md b/README.md index fe1b931..22944a7 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ running it. | [c-structs](./c-structs) | clang-17 | Saves and reads structs in/from binary files. | | [zig-c-interop](./zig-c-interop) | zig-0.11.0 | Uses functions written in C from Zig code. | | [zig-ppm](./zig-ppm) | zig-0.11.0 | Creates an image with random pixels in PPM image format. | -| [zig-structs](./zig-structs) | zig-0.11.0 | Serialization of a struct into JSON and then reading it back. | +| [zig-struct-json](./zig-struct-json) | zig-0.11.0 | Serialization of a struct into JSON and then reading it back. | | [zig-telnet](./zig-telnet) | zig-0.11.0 | Connects to Redis server like it is a basic telnet server. | | [zig-x11](./zig-x11) | zig-0.11.0 | Uses X11 to create a basic window without any bindings needed. | | [zig-http](./zig-http) | zig-0.11.0 | Basic example of a HTTP 1.1 server without any routing etc. | @@ -34,6 +34,7 @@ running it. | [zig-os-props](./zig-os-props) | zig-0.11.0 | Detects properties of the target operating system. | | [zig-tlv-encoding](./zig-tlv-encoding) | zig-0.13.0 | Naive implementation of TLV encoding in Zig. | | [zig-embed](./zig-embed) | zig-0.13.0 | Embedding external resources in compiled binary. | +| [zig-struct-bin](./zig-struct-bin) | zig-0.13.0 | Save a struct into binary file and then reading it back. | ## License diff --git a/zig-struct-bin/Makefile b/zig-struct-bin/Makefile new file mode 100644 index 0000000..98beea6 --- /dev/null +++ b/zig-struct-bin/Makefile @@ -0,0 +1,2 @@ +default: + zig test main.zig diff --git a/zig-struct-bin/main.zig b/zig-struct-bin/main.zig new file mode 100644 index 0000000..4193242 --- /dev/null +++ b/zig-struct-bin/main.zig @@ -0,0 +1,35 @@ +const std = @import("std"); + +const Sample = packed struct { + type: u16, + machine: u16, + version: u32, +}; + +test "write" { + const s = Sample{ + .type = 54, + .machine = 72, + .version = 132, + }; + + std.debug.print("{}\n", .{s}); + + var file = try std.fs.cwd().createFile("out.bin", .{}); + defer file.close(); + + try file.writeAll(std.mem.asBytes(&s)); +} + +test "read" { + var file = try std.fs.cwd().openFile("./out.bin", .{}); + defer file.close(); + + var buffer: [8]u8 = undefined; + _ = try file.read(buffer[0..]); + + const s: *Sample = @ptrCast(@alignCast(&buffer)); + std.debug.print("{}\n", .{s}); +} + +pub fn main() void {} diff --git a/zig-struct-bin/out.bin b/zig-struct-bin/out.bin new file mode 100644 index 0000000..44ae9d8 Binary files /dev/null and b/zig-struct-bin/out.bin differ diff --git a/zig-struct-json/Makefile b/zig-struct-json/Makefile new file mode 100644 index 0000000..9afb087 --- /dev/null +++ b/zig-struct-json/Makefile @@ -0,0 +1,7 @@ +default: write read + +write: + zig run write.zig + +read: + zig run read.zig diff --git a/zig-struct-json/player.json b/zig-struct-json/player.json new file mode 100644 index 0000000..16cdeb6 --- /dev/null +++ b/zig-struct-json/player.json @@ -0,0 +1 @@ +{"name":"Johnny Blaze","age":34} \ No newline at end of file diff --git a/zig-struct-json/player.zig b/zig-struct-json/player.zig new file mode 100644 index 0000000..6cbd354 --- /dev/null +++ b/zig-struct-json/player.zig @@ -0,0 +1,6 @@ +const std = @import("std"); + +pub const Player = struct { + name: []const u8, + age: u8, +}; diff --git a/zig-struct-json/read.zig b/zig-struct-json/read.zig new file mode 100644 index 0000000..95d6390 --- /dev/null +++ b/zig-struct-json/read.zig @@ -0,0 +1,23 @@ +const std = @import("std"); +const player = @import("player.zig"); + +pub fn main() !void { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + defer { + _ = gpa.deinit(); + } + + const file = try std.fs.cwd().openFile("player.json", .{}); + defer file.close(); + + const stat = try file.stat(); + const buffer = try file.readToEndAlloc(allocator, stat.size); + defer allocator.free(buffer); + + const parsed = try std.json.parseFromSlice(player.Player, allocator, buffer, .{}); + defer parsed.deinit(); + + const p: player.Player = parsed.value; + std.debug.print("Reading player with data: {{ Name: {s}, Age: {d} }}\n", .{ p.name, p.age }); +} diff --git a/zig-struct-json/write.zig b/zig-struct-json/write.zig new file mode 100644 index 0000000..9f58489 --- /dev/null +++ b/zig-struct-json/write.zig @@ -0,0 +1,19 @@ +const std = @import("std"); +const player = @import("player.zig"); + +pub fn main() !void { + const p = player.Player{ + .name = "Johnny Blaze", + .age = 34, + }; + + std.debug.print("Writting player with data: {{ Name: {s}, Age: {d} }}\n", .{ p.name, p.age }); + + var playerJSON = try std.json.stringifyAlloc(std.heap.page_allocator, p, .{}); + defer std.heap.page_allocator.free(playerJSON); + + var file = try std.fs.cwd().createFile("player.json", .{}); + defer file.close(); + + _ = try file.writeAll(playerJSON); +} diff --git a/zig-structs/Makefile b/zig-structs/Makefile deleted file mode 100644 index 9afb087..0000000 --- a/zig-structs/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -default: write read - -write: - zig run write.zig - -read: - zig run read.zig diff --git a/zig-structs/player.json b/zig-structs/player.json deleted file mode 100644 index 16cdeb6..0000000 --- a/zig-structs/player.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"Johnny Blaze","age":34} \ No newline at end of file diff --git a/zig-structs/player.zig b/zig-structs/player.zig deleted file mode 100644 index 6cbd354..0000000 --- a/zig-structs/player.zig +++ /dev/null @@ -1,6 +0,0 @@ -const std = @import("std"); - -pub const Player = struct { - name: []const u8, - age: u8, -}; diff --git a/zig-structs/read.zig b/zig-structs/read.zig deleted file mode 100644 index 95d6390..0000000 --- a/zig-structs/read.zig +++ /dev/null @@ -1,23 +0,0 @@ -const std = @import("std"); -const player = @import("player.zig"); - -pub fn main() !void { - var gpa = std.heap.GeneralPurposeAllocator(.{}){}; - const allocator = gpa.allocator(); - defer { - _ = gpa.deinit(); - } - - const file = try std.fs.cwd().openFile("player.json", .{}); - defer file.close(); - - const stat = try file.stat(); - const buffer = try file.readToEndAlloc(allocator, stat.size); - defer allocator.free(buffer); - - const parsed = try std.json.parseFromSlice(player.Player, allocator, buffer, .{}); - defer parsed.deinit(); - - const p: player.Player = parsed.value; - std.debug.print("Reading player with data: {{ Name: {s}, Age: {d} }}\n", .{ p.name, p.age }); -} diff --git a/zig-structs/write.zig b/zig-structs/write.zig deleted file mode 100644 index 9f58489..0000000 --- a/zig-structs/write.zig +++ /dev/null @@ -1,19 +0,0 @@ -const std = @import("std"); -const player = @import("player.zig"); - -pub fn main() !void { - const p = player.Player{ - .name = "Johnny Blaze", - .age = 34, - }; - - std.debug.print("Writting player with data: {{ Name: {s}, Age: {d} }}\n", .{ p.name, p.age }); - - var playerJSON = try std.json.stringifyAlloc(std.heap.page_allocator, p, .{}); - defer std.heap.page_allocator.free(playerJSON); - - var file = try std.fs.cwd().createFile("player.json", .{}); - defer file.close(); - - _ = try file.writeAll(playerJSON); -} -- cgit v1.2.3