我有一个文件
a.txt
:
name1 = value1
name2 = value2
name3 = value3
name4 = value4
name5 = value5
我想将字符串
value3
更新为 89
。我编写了以下程序来实现此目的:
#include <stdio.h>
#include <string.h>
#define MAX_LEN 64
int main(void)
{
FILE *fp = fopen("a.txt", "r+");
char line[MAX_LEN];
long l = 89;
while (fgets(line, MAX_LEN, fp)) {
if (strncmp(line, "name3", 5) == 0) {
fseek(fp, -1 * (strlen(line)), SEEK_CUR);
sprintf(line, "name3 = %ld", l);
fputs(line, fp);
goto close;
}
}
close:
fflush(fp);
fseek(fp, 0, SEEK_END);
fclose(fp);
}
虽然值已更新,但我不确定如何删除其余的尾随字符:
lue3
。这是我执行程序后得到的结果:
name1 = value1
name2 = value2
name3 = 89lue3
name4 = value4
name5 = value5
有人可以告诉我该怎么做吗?当然,我可以将一堆
\t
附加到 sprintf()
的第二个参数来清除尾随字符,但这看起来并不酷。另外,有没有更好的方法来编写这个程序?预先感谢。
不幸的是,虽然文件中间的字节可以被覆盖,但无法插入或删除字节以使文件的剩余字节保持不变。
我认为考虑如何使用配置文件很重要。如果它是“人类可写的”,那么要求每个值后面都有一堆空格确实是不酷的。
通常,实现您想要做的事情的最简单方法是读取并解析整个文件,进行您想要的更改,然后将其写回。这适用于配置文件相对较小且更新相对不频繁的所有情况。
我假设您已经有一些代码可以将配置文件读取到某种键/值映射中以便于访问。添加额外的函数来更新特定值,然后将它们全部写回不会有太多额外的工作。
但是,我可以想象配置文件很大、经常写入并且不被认为是人类可写的情况。在这种情况下,考虑其他方法可能是合适的。例如,可以使每个值字段的长度恰好为 15 个字符。写入值字段时,请始终写入 15 个字符,并用空格适当填充。