はじめに
今回は、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);
}
終わりに
もし勘違いしている点があれば、ご指摘頂ければ幸いです。