• 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
    ", &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("
    
    
    ");
    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
    4 1
    5 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();
     
  • 相关阅读:
    在cmd中登录ftp服务器
    Is valid identifier?
    Hosting Your Own NuGet Feeds
    NuGet学习笔记
    软件版本的处理
    有些事明显对自己有益,为什么却无法去做?
    .net 程序员成长路线图?
    正确跑步姿势是怎样的?
    什么叫做内心强大?怎样变成一个内心强大的人?
    使用命令行复制目录
  • 原文地址:https://www.cnblogs.com/wanhongnan/p/5724455.html
Copyright © 2020-2023  润新知