1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【基礎知識】Zen言語のファイル入出力

Posted at

はじめに

今回は、zen言語での『ファイルの入出力』方法について、
C言語と比較させながら、いくつかまとめてみたいと思います!!

前提

  • Zen言語バージョン : 0.8.20191124+552247019(Mac)

##【ファイル出力】

C言語で実現する場合

C言語の入門書などで見かける、ファイルへの出力はこのように書くのではないでしょうか?

#include <stdio.h>
int main()
{
    // ファイルを「書き込み可(上書き)」で開く
    FILE *fp = fopen("hello.txt", "w");

    // ファイルに書き込む
    fprintf(fp, "HelloWorld");

    // ファイルを閉じる
    fclose(fp);
}

Zen言語で実現する場合

Zen言語でもC言語と同様の流れで書くことができます。

const std = @import("std");

pub fn main() anyerror!void {
    // ファイルを「書き込み可(上書き)」で開く
    const fp = try std.fs.File.openWrite("hello.txt");

    // ファイルに書き込む
    try fp.write("hello world");

    // ファイルを閉じる
    fp.close();
}

ただファイルを開いて書き込むだけなら、簡単にこの一文で書くことも可能でした!
fs.writeFile(file_path, write_data);

const std = @import("std");

pub fn main() anyerror!void {
    // ファイルを開く、ファイルに書き込む、ファイルを閉じるを同時に行う
    try std.fs.writeFile("hello.txt", "HelloWorld");
}

また、C言語の低水準出力関数のopen(), write()に近い関数もあります。

os.open(file_path, flags, parm);
os.write(fd, write_data);
(※open()関数のflagsは、C言語のドキュメントが参考になりました)

const std = @import("std");
const os = std.os;

pub fn main() anyerror!void {
    // ファイルを「書き込み可(上書き)」で開く
    const fd = try os.open("hello.txt", os.O_WRONLY | os.O_CREAT | os.O_CLOEXEC,  0);

    // ファイルに書き込む
    _ = try os.write(fd, "HelloWorld\n");

    // ファイルを閉じる
    os.close(fd);
}

##【ファイル入力】
###C言語で実現する場合

ファイル出力と同様に、C言語の入門書などで見かけるサンプルプログラムと比較します。

#include <stdio.h>
int main()
{
    char buf[50]={};

    // ファイルを「読み込み可」で開く
    FILE *fp = fopen("hello.txt", "r");

    // ファイルから読み込む
    fscanf(fp, "%s ", buf);
    printf("%s\n", buf);

    // ファイルを閉じる
    fclose(fp);
}

Zen言語の方法

const std = @import("std");

pub fn main() anyerror!void {
    var buf = [_]u8{0} ** 50;

    // ファイルを「読み込み可」で開く
    const fp = try std.fs.File.openRead("hello.txt");
    
    // ファイルから読み込む
    _ = try fp.read(buf[0..]);
    const stdout = try std.fs.getStdOut();
    try stdout.write(buf);

    // ファイルを閉じる
    fp.close();
}

(※)補足説明

  • 4行目のvar buf = [_]u8{0} ** 50は、0初期化された文字列型を宣言しています。
  • 10行目にあるbuf[0..]は、文字列型からスライス型へ変換しています。

また、ファイル出力と同様に、入力にも低水準入力のread()に近い関数がありました。

const std = @import("std");

pub fn main() anyerror!void {
    var buf = [_]u8{0} ** 50;

    // ファイルを「読み込み可」で開く
    const fd = try os.open("hello.txt", os.O_RDONLY | os.O_CLOEXEC,  0);
    
    // ファイルから読み込む
    _ = try os.read(fd, buf[0..]);
    const stdout = try std.fs.getStdOut();
    try stdout.write(buf);

    // ファイルを閉じる
    os.close(fd);
}

終わりに

もし勘違いしている点があれば、ご指摘頂ければ幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?