c - 在 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) )?
解决方案
如何在我创建的结构中存储变量名称和数据(由带有等号的行表示)?
像这样的东西:
int p = 0;
while (buffer[p] != '=') {
key[p] = buffer[p];
p++;
}
key[p] = '\0';
strcpy(data, buffer+p+1);
对于键,我们一次复制一个字符,直到到达“=”。取而代之的是,我们放置了一个空终止符。对于数据,我们在“=”之后继续打印。
存储后,我应该如何浏览文件并用它们的定义替换所有变量(前面用美元'$'符号和变量周围的括号表示,如 $(VARIABLE) )?
您无法就地替换它们,因为它们可能具有不同的大小,因此您需要复制文件并随时进行替换。它看起来像这样:
- 转到“$(”的第一次出现
- 将之前的所有内容复制到文件的修改版本
- 将 "$(" 到下一个 ")" 的所有内容复制到单独的字符串
- 去掉 "$(" 和 ")" 得到变量名
- 使用在变量列表中查找该变量名称
strcmp
- 将您找到的字符串附加到修改后的文件中
- 将光标设置在“)”之后并重复直到完成
您可能需要考虑的事情是您必须检查行尾字符。此外,如果您使用拼凑副本,请注意其运行时间与两个字符串strcat
的大小成正比。因此,如果您将变量值添加到文件中,它会一直遍历文件以找到空终止符并将值附加到那里。这对于小文件没有问题,但是对于有很多附加的大文件,您可能需要编写自己的字符串连接函数来保存空终止符的位置,这样就不必每次都查找它。
推荐阅读
- firebase - 为什么不能使用 firebase url 从 googlesheet 向 firebase 添加数据
- android - 具有 onClick 功能的嵌套 RecyclerView
- sabre - Sabre 中所做的更改不会立即反映在 API 中
- angular - RxJs - 动态地将相互依赖的同步调用添加到没有嵌套的 fork join
- javascript - Javascript 比较结果为单个对象数组,如果值在同一对象数组中匹配,则追加
- c++ - 创建 dll 时 applink.c 文件出现问题
- mysql - MySQL Where IN 必须匹配所有值
- veracode - ESAPI 的目的是什么?
- svelte - 使用不同的语言进行纤细的路由
- azure-data-factory - 如何将变量从主管道传递到 Azure 数据工厂中的子管道?