Linux 修改配置文件(修改文件其中一小部分字符)对文件选定内容进行修改 strstr()函数的用法 sprintf()函数用法

一 应用场景

在之前我们使用write函数 都是改变一整个文件的内容。无法对特定内容进行修改。

例如在游戏中,人物的血量并不是一个特定的值。人物受到攻击时,血量会减少。人物吃到血包或者受到救助时,血量会升高。那么在程序运行过程中就要不断修改人物血量值。

二 对单个字符修改

我们创建一个名字为test的文件
内容如下

speed=5//速度
attack=200//攻击值
blood=250//血量
weapom=25//武器序号

我们所有的内容都是以字符的格式来保存的,数字也是字符的一种。
首先我们先更改speed值,它的值与其他三个值不同。speed值是单个字符。
修改speed就需要在文件中检索,步骤如下

1.打开test文件
2.读取test文件内容
3.检索要修改的变量
4.修改
5.写入test文件

strstr函数

在第三步我们需要一个函数来帮我们完成

char *strstr(const char *haystack, const char *needle);

函数解读:

char * 这个函数返回类型为char型指针变量
const char *haystack 第一个参数为寻找的范围
const char *needle 第二个参数为我们需要寻找的字符
在这里插入图片描述

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
//int open(const char *pathname, int flags);
//int open(const char *pathname, int flags, mode_t mode);
int main()
{
   char *buf;
   char *p;
   buf = "speed=5 attack=200 blood=250 weapom=25";
   p=strstr(buf,"blood=");
   printf("%s",p);
}

运行结果为 blood=250 weapom=25
通过程序示例可以看出 strstr()函数返回的字符指针是我们所寻找字符串的首字母的指针

修改速度 值为8

include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
   int fd;//文件描述符
   char *buf = NULL;//将test文件读到该缓冲区
   char *p;//用来承接strstr返回值
   fd = open("./test",O_RDWR);//打开test文件

   if(fd==-1){
        printf("error\n");
   }else{
        printf("success\n");
   }

   int size=lseek(fd,0,SEEK_END);//用光标来计算文件大小(可以看之前文章)
   buf = (char*)malloc(sizeof(char)*size+8);//开辟文件缓冲区空间
   lseek(fd,0,SEEK_SET);//将光标置于文件首,否则无法读取文件
   int n_read=read(fd,buf,size+8);//读取文件
   p = strstr(buf,"speed=");//搜索speed
   p = p+strlen("speed=");//将指针移到(speed=5)5处
   *p = '8';//赋值为8
   lseek(fd,0,SEEK_SET);//将光标移动到开头,覆盖之前内容
   int n_write=write(fd,buf,size);
   close(fd);
   printf("%s",buf);
}                                                                                                                                                                

三 对字符串进行修改

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
//int open(const char *pathname, int flags);
//int open(const char *pathname, int flags, mode_t mode);
int main()
{
   int fd;
   char *buf = NULL;
   char *p;
   fd = open("./test",O_RDWR);

   if(fd==-1){
        printf("error\n");
   }else{
        printf("success\n");
   }

   int size=lseek(fd,0,SEEK_END);
   buf = (char*)malloc(sizeof(char)*size+8);
   lseek(fd,0,SEEK_SET);
   int n_read=read(fd,buf,size+8);
   p = strstr(buf,"speed=");
   p = p+strlen("speed=");
   *p = '800';//在此处修改 将speed改为800
   lseek(fd,0,SEEK_SET);
   int n_write=write(fd,buf,size);
   close(fd);
   printf("%s",buf);
}

运行本程序时,则会报错 multi-character character constant [-Wmultichar]
转换溢出,还有可能指针类型不匹配。我们需要将改变的数字转换为字符串

sprintf()函数

 sprintf(string,formt,value)函数

本函数有三个参数 string就是指向要写入的那个字符串的指针
formt为转换的类型和精度
将value打印到string中
我们将学量改为800

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
//int open(const char *pathname, int flags);
//int open(const char *pathname, int flags, mode_t mode);
int main()
{
   int fd;
   char *buf = NULL;
   char *p;
   char *string;
   int i;
   string = (char *)malloc(sizeof(int)*4);
   fd = open("./test",O_RDWR);
   if(fd==-1){
        printf("error\n");
   }else{
        printf("success\n");
   }

   int size=lseek(fd,0,SEEK_END);
   buf = (char*)malloc(sizeof(char)*size+8);
   lseek(fd,0,SEEK_SET);
   int n_read=read(fd,buf,size+8);
   p = strstr(buf,"blood=");
   p = p+strlen("blood=");
   sprintf(string,"%d",800);//将800写入字符串中
   for(i=0;i<strlen(string);i++){ //通过移动指针p一个个写入
        *p = string[i];
         p++;
}
   lseek(fd,0,SEEK_SET);
   int n_write=write(fd,buf,size);
   close(fd);
   printf("%s",buf);
}

在这里插入图片描述
血量已改为800

本此内容全部结束,有不懂的地方可以评论区留言哦

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: #include <stdio.h> int main() { FILE *fp; char filename[] = "config.txt"; char parameter[100]; int value; /* 从文件读取参数 */ fp = fopen(filename, "r"); fscanf(fp, "%s %d", parameter, &value); printf("从文件读取的参数是: %s=%d\n", parameter, value); fclose(fp); /* 更新参数,并将参数写入文件 */ value += 10; fp = fopen(filename, "w"); fprintf(fp, "%s %d", parameter, value); printf("更新后的参数是: %s=%d\n", parameter, value); fclose(fp); return 0; } ### 回答2: 下面是一个示例的Linux C代码,用于读取和写入配置文件参数: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_LENGTH 100 void readConfigFile(const char* filename) { FILE* file = fopen(filename, "r"); if (file == NULL) { printf("无法打开配置文件:%s\n", filename); return; } char line[MAX_LINE_LENGTH]; while (fgets(line, sizeof(line), file)) { char* key = strtok(line, "="); char* value = strtok(NULL, "="); if (key != NULL && value != NULL) { // 去除末尾的换行符 value[strcspn(value, "\n")] = 0; printf("配置参数:%s = %s\n", key, value); } } fclose(file); } void writeConfigFile(const char* filename, const char* key, const char* value) { FILE* file = fopen(filename, "a"); if (file == NULL) { printf("无法打开配置文件:%s\n", filename); return; } fprintf(file, "%s=%s\n", key, value); fclose(file); printf("已写入配置参数:%s = %s\n", key, value); } int main() { const char* filename = "config.txt"; const char* key = "param1"; const char* value = "value1"; writeConfigFile(filename, key, value); readConfigFile(filename); return 0; } ``` 这段代码定义了两个函数:`readConfigFile` 用于读取配置文件参数,`writeConfigFile` 用于写入配置文件参数。`readConfigFile` 函数会逐行读取配置文件,并使用等号("=")分隔键和值,然后去除值末尾的换行符,并打印出配置参数。`writeConfigFile` 函数会将传入的键值对追加写入配置文件,并打印出写入的配置参数。 在 `main` 函数,我们提供了一个示例的配置文件名("config.txt"),以及一个示例的键和值("param1" 和 "value1")。我们首先使用 `writeConfigFile` 函数将示例的键值对写入配置文件,然后使用 `readConfigFile` 函数读取配置文件并打印出配置参数。 请注意,此示例的配置文件格式是按行存储键值对,每行使用等号分隔键和值。你可以根据实际需求进行适当的修改和扩展。 ### 回答3: 下面是一个简单的示例,演示了如何使用C语言编写一个读取和写入配置文件参数的功能。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define FILE_NAME "config.txt" // 配置文件名 // 函数声明 void readConfig(); void writeConfig(char* paramName, char* paramValue); int main() { // 读取配置文件 readConfig(); // 写入配置文件 writeConfig("param1", "value1"); writeConfig("param2", "value2"); writeConfig("param3", "value3"); // 读取更新后的配置文件 readConfig(); return 0; } void readConfig() { FILE* file; char line[100]; // 打开配置文件 file = fopen(FILE_NAME, "r"); if (file == NULL) { printf("无法打开配置文件。\n"); return; } // 按行读取配置文件内容并打印 while (fgets(line, sizeof(line), file) != NULL) { printf("%s", line); } // 关闭配置文件 fclose(file); } void writeConfig(char* paramName, char* paramValue) { FILE* file; // 打开配置文件以追加写入的方式 file = fopen(FILE_NAME, "a"); if (file == NULL) { printf("无法打开配置文件。\n"); return; } // 写入参数名和参数值到配置文件 fprintf(file, "%s=%s\n", paramName, paramValue); // 关闭配置文件 fclose(file); } ``` 以上代码包含了两个函数: 1. `readConfig()` 函数用于读取配置文件并将其内容打印到控制台。 2. `writeConfig()` 函数用于将参数名和参数值写入配置文件。 在 `main()` 函数,首先调用 `readConfig()` 函数读取初始的配置文件内容并打印;然后使用 `writeConfig()` 函数写入三个参数名和参数值到配置文件;最后再次调用 `readConfig()` 函数读取更新后的配置文件内容并打印到控制台。 注意,上述代码的 `FILE_NAME` 宏定义了配置文件文件名,请根据实际需要修改为您的配置文件名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pg_hj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值