File 查找并替换文件中的一行

File 查找并替换文件中的一行,file,d,stdio,seek,File,D,Stdio,Seek,我的目标是逐行搜索文件,直到找到格式为varName=varValue的变量声明。将字节数累加到该行的开头,然后将该行替换为相同的varName但为新值 这是一个非常简单的配置文件处理程序,我从头开始编写它以避免任何依赖关系。我之所以这样做,而不仅仅是转储string[string]关联数组,是因为我想保留注释。我还希望避免将整个文件读入内存,因为它可能会变大 这是我编写的代码,但在使用setVariable时,没有发生任何事情,文件保持不变 import std.stdio: File; im

我的目标是逐行搜索文件,直到找到格式为
varName=varValue
的变量声明。将字节数累加到该行的开头,然后将该行替换为相同的
varName
但为新值

这是一个非常简单的配置文件处理程序,我从头开始编写它以避免任何依赖关系。我之所以这样做,而不仅仅是转储
string[string]
关联数组,是因为我想保留注释。我还希望避免将整个文件读入内存,因为它可能会变大

这是我编写的代码,但在使用
setVariable
时,没有发生任何事情,文件保持不变

import std.stdio: File;
import std.string: indexOf, strip, stripRight, split, startsWith;
import std.range: enumerate;

ptrdiff_t getVarPosition(File configFile, const string varName) {
    size_t countedBytes = 0;

    foreach (line, text; configFile.byLine().enumerate(1)) {
        if (text.strip().startsWith(varName))
            return countedBytes;

        countedBytes += text.length;
    }

    return -1;
}

void setVariable(File configFile, const string varName, const string varValue) {
    ptrdiff_t varPosition = getVarPosition(configFile, varName);

    if (varPosition == -1)
        return; // For now, just return. This variable doesn't exist.
        // Will handle this later, it needs to append to the bottom of the file.

    configFile.seek(varPosition);
    configFile.write(varName ~ " = " ~ varValue);
}

代码中有几个部分缺失,这使得诊断很困难。最重要的问题可能是“如何打开配置文件?”。此代码实现了我所期望的:

unittest {
    auto f = File("foo.txt", "r+");
    setVariable(f, "var3", "foo");
    f.flush();
}

也就是说,它查找以“var3”开头的行,并用新值替换部分文件。但是,您的
getVarPosition
函数不计算换行,因此偏移量是错误的。另外,考虑新的<代码> Value< /Cord>与旧的值不同时会发生什么。如果您有“var=helloworld”,并调用
setVariable(f,“var”,“bye”)
,您将得到“var=byelo-world”。如果它比现有值长,它将覆盖下一个变量。

尽量减少代码的长度,以解决问题。我不确定你的实际问题是什么。
readConfig
是否真的依赖于此问题?
文件configFile
在哪里打开?显示一个示例配置文件并添加
main
函数,该函数将显示它是如何工作的。(顺便说一句,您正在创建一个依赖项,它只是第一方依赖项:)那么,没有第三方库大小或许可证的优势是什么呢