D语言文件操作
文件操作软件制作过程中经常会使用到。D语言的文件操作需要使用std.stdio包,在D语File被封装为一个结构类型struct File。写个例子来试试, 简单使用文件的方式需要使用std.file 模块,在后面也后介绍:
1. 写入文件一行
auto file = File("abc.txt"); file.writeln("abc");
file.close();
运行后出异常提示Cannot open file `abc.txt' in mode `rb' (No such file or directory) ,不能打开文件,oo。原来默认的打开文件的方式是rb,只读模式,不能写入。
auto file = File("abc.txt","wb"); file.writeln("text");
file.close();
加上wb就可以使用了,File结构打开文件是使用的fopen完成的,有个mode参数有以下几种:
参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
rb+ 读写打开一个二进制文件,只允许读写数据。
rt+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
wt+ 读写打开或着建立一个文本文件;允许读写。
at+ 读写打开一个文本文件,允许读或在文本末追加数据。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
2. 读取文件一行
auto file = File("abc.txt","rb");
auto str = file.readln();
file.close();
string line; while ((line = readln()) !is null) write(line);
3.按格式读取
auto f = File("abc.txt"); string s; f.readf("%s\n", &s); writeln(s);
file.close();
4.读取行迭代集
auto file = File("abc.txt");
foreach (line; file.byLine())
{
writeln(line);
}
file.close();
const wordCount = file.byLine() // 读取所有行 .map!split // 以空格分隔为单词,英文以空格分隔 .map!(a => a.length) // 读单词数量 .reduce!((a, b) => a + b); // 统计单词数量
writeln(wordCount);
5.读取到缓冲区
auto f = File("abc.txt", "r"); auto buf = f.rawRead(new char[5]); f.close();
6.写缓冲到文件
auto f = File("abc.txt", "w");
f.rawWrite("\r\n\n\r\n"); f.close();
7.定位与偏移
auto f = File("abc.txt", "w+"); f.seek(7);
int offset = f.tell; //offset = 7
8.临时文件
auto tmp = File.tmpfile()
9.按块在读取
foreach (ubyte[] buffer; stdin.byChunk(4096))
{
... use buffer ...
}
foreach (ubyte[] buffer; chunks(stdin, 4096))
{
... use buffer ...
}
10.文本写入器
File f = File(deleteme, "w"); auto writer = f.lockingTextWriter(); writer.put("日本語"); writer.put("日本語"w); writer.put("日本語"d); writer.put('日'); writer.put(chain(only('本'), only('語'))); writer.put(repeat('#', 12)); // BUG 11945
文件模块的使用
除了std.stdio包中对文件的操作外,还有一个std.file文件模块
1.基本的读写很方便
//写入文件
std.file.write("abc.txt", "1 2\n4 1\n5 100");
//读取文本
auto str = std.file.readText("abc.txt");
//删除文件
std.file.remove("abc.txt");
//取大小
auto size = std.file.getSize("abc.txt");
//复制文件
std.file.copy("abc.txt","abc1.txt");
//重命名
std.file.rename("abc.txt","abc1.txt");
//取当前目录
auto path = std.file.getcwd();
//文件是否存在
auto exist = std.file.exists("abc.txt");
//删除目录
std.file.rmdir("c://abc/");
//修改当前目录
std.file.chdir("c://test/");
//新建目录
std.file.mkdir("c://test/");
//取临时目录
auto dir = std.file.tempDir();