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();
 
posted @ 2016-08-01 01:45  honan  阅读(411)  评论(0编辑  收藏  举报