首页 > 解决方案 > 在 C 中记录和替换文本文件中的变量

问题描述

我有点卡在我正在做的一个项目上。我正在尝试编写一个函数,该函数通过文本文件并将任何变量分配存储在由键(变量名)和数据(变量数据)组成的数据结构中。如果有人有兴趣看一下,这是该项目。

到目前为止,我能够做的是对文件进行索引并确定有多少行包含等于“=”符号,每次找到这样的行时递增一个变量,并使用该变量初始化一个新的构造来保存变量. 这是函数的代码,称为replaceVariables:(这还没有完成)

struct VarMap {
    char data[1000];
    char key[1000];
};

// Use a hash table to store the variables - variablename : definition
void replaceVariables(FILE* spData) {

    // Initialise the counting variable buffer to hold the file line by line
    int varCount = 0;
    char buffer[10000];
    while (fgets(buffer , sizeof(buffer) , spData) != NULL) {
        // Skip commented lines (preceede by hash '#')
        if (buffer[0] == '#') continue;
        for (int i = 0; buffer[i] != '\n' ; i++) {
            if (buffer[i] == '=') {
                // Increment if line with equals sign is found
                varCount++;
                break;
            }
        }
    }
    printf ("varCount has counted %d equals signs.\n\n" , varCount);

    // This will hold the variables
    struct VarMap variables[varCount];
    while (fgets(buffer , sizeof(buffer) , spData) != NULL) {
        if (buffer[0] == '#') continue;
        for (int i = 0; buffer[i] != '\n' ; i++) {
            if (buffer[i] == '=') {
                // Store everything before the first equals sign in the key, and everything after the equals sign as data

                break; // We are not interested if the same line contains anymore equals signs
            }
        }
    }


}

这是上下文的主要功能:(在此可能需要注意的是,替换变量不是程序的主要目的;完成的程序将实现make程序提供的功能的一小部分)

int main(int argc, const char * argv[]) {

    char filepath[1000];
    printf("Enter the filepath of the Bakefile or bakefile: ");
    scanf("%s" , filepath);
    FILE* spData = fopen(filepath , "r");
    if (spData == NULL) {
        printf ("Cannot open file.");
        exit(EXIT_FAILURE);
    }
    replaceVariables(spData);

    fclose(spData);
    return 0;
}

我的问题是:

如何在我创建的结构中存储变量名称和数据(由带有等号的行表示)?

存储后,我应该如何浏览文件并用它们的定义替换所有变量(前面用美元'$'符号和变量周围的括号表示,如 $(VARIABLE) )?

标签: cvariablesmakefile

解决方案


如何在我创建的结构中存储变量名称和数据(由带有等号的行表示)?

像这样的东西:

int p = 0;
while (buffer[p] != '=') {
    key[p] = buffer[p];
    p++;
}
key[p] = '\0';
strcpy(data, buffer+p+1);

对于键,我们一次复制一个字符,直到到达“=”。取而代之的是,我们放置了一个空终止符。对于数据,我们在“=”之后继续打印。

存储后,我应该如何浏览文件并用它们的定义替换所有变量(前面用美元'$'符号和变量周围的括号表示,如 $(VARIABLE) )?

您无法就地替换它们,因为它们可能具有不同的大小,因此您需要复制文件并随时进行替换。它看起来像这样:

  • 转到“$(”的第一次出现
  • 将之前的所有内容复制到文件的修改版本
  • 将 "$(" 到下一个 ")" 的所有内容复制到单独的字符串
  • 去掉 "$(" 和 ")" 得到变量名
  • 使用在变量列表中查找该变量名称strcmp
  • 将您找到的字符串附加到修改后的文件中
  • 将光标设置在“)”之后并重复直到完成

您可能需要考虑的事情是您必须检查行尾字符。此外,如果您使用拼凑副本,请注意其运行时间与两个字符串strcat的大小成正比。因此,如果您将变量值添加到文件中,它会一直遍历文件以找到空终止符并将值附加到那里。这对于小文件没有问题,但是对于有很多附加的大文件,您可能需要编写自己的字符串连接函数来保存空终止符的位置,这样就不必每次都查找它。


推荐阅读