描述
- 当你需要更改某个.json或者.lua文件中的参数
- 文件内容你是完全已知的,注意,是全部已知的
那么你就可以使用下面的代码来更改了
注意,这是一种投机取巧的办法,并不是通过配置lua环境来进行的参数更改,而是暴力重新覆盖文件的方式来更新参数。这种方法是有局限性的,也就是你要知道文件的全部内容,而且你要知道更改什么变量的参数。
除了敏捷开发的需求外,我不建议使用这种方法。正确读取lua的方式可以参考我的另外一篇文章https://blog.csdn.net/weixin_42156097/article/details/105625324
代码
#include <iostream>
#include <string.h>
int main(int argc, char** argv)
{
std::string writeBuffer = "Table = {\n"\
" people = {\n"\
" name = \"%s\",\n"\
" age = %d,\n"\
" },\n"\
"}";
FILE * pf_read = fopen("/Users/admin/Desktop/try.lua", "r"); //打开
char buf[2000]={0};
fread(buf, 1, 2000, pf_read); // 将文件中的内容读到buf中
fclose(pf_read);
std::cout<<buf<<std::endl;
std::string name;
int age;
sscanf(buf, writeBuffer.c_str(), &name, &age); //从buf中读出变量值
std::cout<<name<<std::endl;
std::cout<<age<<std::endl;
name = "Neil and me"; // 你想更改的值
age = 108;
sprintf(buf, writeBuffer.c_str(), name.c_str(), age); //保存变量
int i = 0;
while(buf[i]!='\0'){ // 只截取buf中需要用的内容
i++;
}
FILE * pf_write = fopen("/Users/admin/Desktop/try.lua", "w"); //打开
fwrite(buf, 1, i, pf_write); //写入文件
fclose(pf_write);
}
更改之前的lua文件
Table = {
people = {
name = "Neil",
age = 18,
},
}
更改之后的lua文件
Table = {
people = {
name = "Neil",
age = 18,
},
}
学习
writeBuffer
writeBuffer中填写文件中的全部内容,把你需要更改的地方,使用%来替换。
其中%s代表string,%d代表int,%f代表double,\n换行,\t代表空格,字符串中的双引号使用",字符串一行写不下的话在末尾添加\
fread和fwrite
写法
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
fread/fwrite的意思是从fp这个文件指针读/写buffer字符串的内容,每一次读或者写size个字节,一共执行count次读取或者写size个字节数
sscanf和sprintf
sscanf(buf, writeBuffer.c_str(), &name, &age);
sprintf(buf, writeBuffer.c_str(), name.c_str(), age);
C 库函数 int sscanf(const char *str, const char *format, …) 从字符串读取格式化输入。
C 库函数 int sprintf(char *str, const char *format, …) 发送格式化输出到 str 所指向的字符串。
比较口语化的理解就是:
- sscanf:将format与str进行对比,这样中间被“%”等替代的字符,就可以读到后面的变量中
- sprintf:将format与str进行对比,这样中间被“%”等替代的字符,就可以写到str中
rewind
上面的代码没有用到rewind,但是有必要在这里学习一下rewind
rewind的意思就是将文件内部的位置指针重新指向一个流(数据流/文件)的开头,写法
rewind(pf_read)
pf_read这个指针是指向整个文件,如果不重新赋值文件指针不会改变。但是rewind改变的文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。
简单来说我执行
FILE * pf_read = fopen("/Users/admin/Desktop/try.lua", "r"); //打开
char buf[2000]={0};
fread(buf, 1, 2000, pf_read); // 将文件中的内容读到buf中
这时文件内部的指针已经移动到了文件末尾,我程序的打开方式是“r”,现在我只读取了文件内容一次,我如果想要再读取一次呢。显然我需要执行rewind(pf_read),把文件内部指针重新指向开头。
我的代码里没有使用rewind的原因是,我只读了文件一次,而且我读和写文件分别使用了不同的文件指针pf_read和pf_write