#include "stdafx.h" #include <stdio.h> #include <string.h> #include <errno.h> /* 将名值对name=value写入文本文件file 如果文件中该名值对已经存在,则更新已存在的名值对 参数: file -- 文本格式的配置文件名 name -- 名值对中的名字 value -- 名值对中的值 返回: 0 -- 成功 -1 -- 失败 */ int write_config(const char *file,const char *name,const char *value) { int flag = 0; FILE *fp,*fp_tmp; fp = fopen(file,"r"); if(NULL == fp){ printf("fopen error,%s\n",strerror(errno)); return -1; } char file_tmp[256] = {0}; strcat(file_tmp,file); strcat(file_tmp,".tmp"); fp_tmp = fopen(file_tmp,"w+"); if(NULL == fp_tmp){ printf("fopen error,%s\n",strerror(errno)); return -1; } char buf[256]; while(!feof(fp)){ buf[0] = '\0'; fgets(buf,256,fp); if(strncmp(buf,name,strlen(name)) == 0){ flag = 1; fprintf(fp_tmp,"%s = %s\n",name,value); } else{ fprintf(fp_tmp,buf); } } if(flag == 0){ fprintf(fp_tmp,"%s = %s\n",name,value); } fclose(fp); fclose(fp_tmp); //unlink(file); if(remove(file) != 0){ printf("remove error,%s\n",strerror(errno)); } if(rename(file_tmp,file) != 0){ printf("rename error,%s\n",strerror(errno)); } return 0; } /* 将value_arr的值清除两边空格 */ char * del_space(char *value_arr){ //printf("value_arr = %s\n",value_arr); char *value_arr_head,*value_arr_tail; value_arr_head = value_arr; while(*value_arr_head == ' '){ value_arr_head++; } value_arr = value_arr_head; //到此,value_arr去掉了前面的空格 //printf("value_arr = %s\n",value_arr); //去掉value_arr的后面空格 value_arr_head = value_arr; while(*value_arr_head != '\0'){ // eg: User = Jack son value_arr_head++; } value_arr_tail = value_arr_head - 1; while(*value_arr_tail == ' '){ *value_arr_tail = '\0'; value_arr_tail--; } //printf("value_arr = %s\n",value_arr); return value_arr; } /* 从文本文件file中读取名为name的名值对的值,将值存入参数value指向目标缓冲区。 参数: file -- 文本格式的配置文件名 name -- 名值对中的名字 value -- 用于存放值的目标缓冲区 size -- 目标缓冲区大小 返回: >=0 -- 成功读取到的值的长度,以字节为单位。 -1 -- 失败 */ int read_config(const char *file,const char *name,char *value,int size) { char file_buf[256],*p_file_buf; FILE *fp; fp = fopen(file,"r+"); if(NULL == fp){ printf("fopen error,%s\n",strerror(errno)); return -1; } while(!feof(fp)){ char *del_file_buf; fgets(file_buf,256,fp); del_file_buf = del_space(file_buf); if(strncmp(del_file_buf,name,strlen(name)) == 0){ p_file_buf = del_file_buf; while(*p_file_buf != '='){ p_file_buf++; } p_file_buf++; /* 定义一个数组,并将value值赋给它 */ char value_arr[256]; int i = 0; while (*p_file_buf != '\0'){ value_arr[i] = *p_file_buf; i++; p_file_buf++; } value_arr[i] = '\0'; // 将value_arr的值清除空格 value = del_space(value_arr); printf("value = %s\n",value); fclose(fp); return 0; } } return 0; } //下面主函数为调用示例,请不要进行任何改动。 int main() { char buf[256]; /* 假定有a.ini,内容如下: Server=192.168.1.2 User = Jackson Password=abc */ write_config("./a.ini","Database","MyDB"); /* 执行完上一行后,a.ini的内容应该为: Server=192.168.1.2 User = Jackson Password=abc Database=MyDB */ write_config("./a.ini","Password","xyz"); /* 执行完上一行后,a.ini的内容应该为: Server=192.168.1.2 User = Jackson Password=xyz Database=MyDB */ read_config("./a.ini","Server",buf,sizeof(buf)); /* 执行完上一行后,buf里面应该存放字符串"192.168.1.2" */ read_config("./a.ini","User",buf,sizeof(buf)); /* 执行完上一行后,buf里面应该存放字符串"Jackson" */ return 0; } /* 该题思路是:文本里是以二进制存放数据的,容易犯的错误就是用指针直接在中间更新 * 写的时候就是一段一段的读取原文件,相同直接复制,否则更新或者添加, * 读则要先去掉两边的空格,用指针节省空间 */