C++读写文件并更改已知内容中的参数

描述

  1. 当你需要更改某个.json或者.lua文件中的参数
  2. 文件内容你是完全已知的,注意,是全部已知的

那么你就可以使用下面的代码来更改了

注意,这是一种投机取巧的办法,并不是通过配置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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值