我有一个需要修改的配置文件。
文件结构为:
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\r\n", key, msg->resolution);
}
} else if(strcmp(key, "interval") == 0) {
if(msg->interval) {
fprintf(fp, "%s %d\r\n", key, msg->interval);
}
} else {
fputs(str, fp);
}
} else {
fputs(str, fp);
}
}
} else {
(void)printf("-- Configuration file not found (%s)\r\n --", configuration_file);
}
fclose(fp);
想法是逐行阅读。根据以下文件:
fgets
说它停在新线。字符串扫描每一行并将其解析为键和值。到目前为止一切顺利,正如预期的那样。然后将新行打印到文件中,覆盖刚刚扫描的行。这就是问题所在。如果我使用
fprintf
,仅处理第一个值resolution。其结果是:
resolution oldxres
resolution newxres
它会覆盖错误的行,并完全跳过第二行。
如果我删除
格式化输出
而不是简单地打印找到的值,而是按预期打印这两个值。
我错过了什么?做
格式化输出
推送文件指针?