用C替换文本文件中的行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C替换文本文件中的行相关的知识,希望对你有一定的参考价值。

我有一个我需要改变的配置文件。

该文件的结构是:

resolution 12x34
interval 1234

所以两个字符串带有空格分隔符。我用来改变它的代码是这样的:

FILE *fp = fopen(configuration_file, "a+");
char str[100], key[100], value[100];
if(fp) {
    while(fgets(str, 100, fp) != NULL) {
        if(2 == sscanf(str, "%s %s", &key, &value)) {
            if(strcmp(key, "resolution") == 0){
                if(msg->resolution){
                    fprintf(fp, "%s %s
", key, msg->resolution);
                }
            } else if(strcmp(key, "interval") == 0) {
                if(msg->interval) {
                    fprintf(fp, "%s %d
", key, msg->interval);
                }
            } else {
                fputs(str, fp);
            } 
        } else {
            fputs(str, fp);
        }
    }
} else {
    (void)printf("-- Configuration file not found (%s)
 --", configuration_file);
}
fclose(fp);

这个想法是逐行阅读。根据fgets的文档说,它停止在换行符。对每行进行字符串扫描并将其解析为键和值。到目前为止这么好,按预期行事。然后将新行打印到文件中,覆盖刚刚扫描的行。这就是问题所在。如果我使用fprintf,只处理第一个值,即分辨率。结果是:

resolution oldxres
resolution newxres

它会覆盖错误的行并完全跳过第二行。

如果我删除fprintf而只是打印它找到的值,它会按照预期打印。

我在这里错过了什么? fprintf推文件指针吗?

答案

然后将新行打印到文件中,覆盖刚刚扫描的行。

文件不能以这种方式工作。写入新文件。完成后,将新文件重命名为旧名称。或者,将整个文件读入内存,更改内存中的内容,然后将其写回。

如果修改的行永远不会比原始行更长,则可以重写单个行。否则,修改后的行将溢出您尚未阅读的下一行,并将其销毁。为了防止这种情况,你需要某种前瞻缓冲区,这太麻烦且容易出错。在最坏的情况下,无论如何你都需要阅读整个文件。

以上是关于用C替换文本文件中的行的主要内容,如果未能解决你的问题,请参考以下文章

根据标志替换 .txt 文件中的行

使 sed 替换文件中的文本,并在屏幕上显示替换的行

替换文本内容

请教高手,怎么用awk来读取一个文本文件的指定行的内容

如何使用C替换文本文件中的字符?

替换包含特殊字符的文本中的行(数学方程)linux文本