【问题标题】:How do I read a file, wihout loading it into the memory, like the Delphi TFileStream class in D?如何读取文件而不将其加载到内存中,例如 D 中的 Delphi TFileStream 类?
【发布时间】:2016-04-14 11:23:59
【问题描述】:

我在某处读到 std.stdio 的文件将文件加载到内存中,然后读取它。我来自 Delphi,那里有一个 TFileStream 类,可以用来读/写文件,而不需要将它们加载到内存中。在写/读时,我不必担心行尾或任何特殊字符,我可以提供我想读/写的字节数,甚至可以读/写字节数组,我不确定 std.stdio.File 有没有。

在 D 中也可以吗?我只想从我提供的位置从文件中读取一些字节,而不将整个文件加载到内存中(文件非常大)?如果是,那么如何?还有一件事,我必须将文件读取到 ubytes(0-255) 数组中

P.S:该方法应该适用于 Linux,Windows 不是我的目标;

【问题讨论】:

  • 您需要流抽象,还是只对文件 I/O 感兴趣?
  • std.stdio 确实有你在那里提到的东西。不要相信您在互联网上阅读的所有内容,请先尝试自己看看!

标签: file delphi d


【解决方案1】:

D 标准库中的任何模块都没有你所说的“在某处读过”。但是,std.file 模块中有一个函数可以用来读取整个文件 - read() function。此函数具有签名void[] read(R)(R name, size_t upTo = size_t.max),可用于读取upTo 字节数。自然,如果您省略 upTo 参数,它将读取整个文件(或填满您的内存!)。

按照 Richard 的建议,使用 std.stdio 模块中的 File 包装器来执行任意 seek() 和 read() 操作。

如果您的文件很大,最好使用std.mmfile。非常方便,可以像处理切片(数组)一样处理内存映射文件...Related SO thread

【讨论】:

  • std.mmfile 是我要找的!
  • std.mmfile 绝对不类似于 Delphi 的文件流。内存映射文件往往用于非常特定的专业应用程序。你确定这是你需要的吗?
【解决方案2】:

你想要的是File 并使用方法 seek 和 rawRead/rawWrite。 它只是围绕 c 库进行包装,这里没有什么花哨的。

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 2011-01-16
    • 2022-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多