读文件 —— 读写配置文件
例如 —— 配置文件的格式如下:
./net.conf 的文件的內容為
IP=192.168.1.20?
MASK=255.255.255.0?
DNS=192.168.1.1
(要把IP的值進行修改)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdint.h>#define STR_NETWORKCFG_FILE "./net.conf"struct info_t{char name[20];char data[60]; }; int GetFile_Info(char *name,char *result) {char linebuffer[100] = {0};char buffer1[100] = {0};char buffer2[100] = {0};uint8_t flag = 0;int buffer_size=0;FILE *fp = fopen(STR_NETWORKCFG_FILE, "r");if(fp == NULL){printf("open error");return 1;}while(1){char *ret = fgets(linebuffer, 100, fp);if(ret == NULL){break;}sscanf(linebuffer, "%[^=]=%[^=]", buffer1,buffer2);printf("%s",linebuffer);printf("\n**\n");if(!strcmp(name, buffer1)){buffer_size=strlen(buffer2);memcpy(result,buffer2,buffer_size);result[buffer_size-1]='\0';//remove the \nflag = 1;break;}memset(buffer1,0,sizeof(buffer1));memset(buffer2,0,sizeof(buffer2));memset(linebuffer,0,sizeof(linebuffer));}fclose(fp);if(flag != 1)return 1;return 0; }/*獲取所有文件信息,存入結構體中,遇到需修改的字段,修改后存入結構體,后再全部重新寫入保存*/ int ChangeFile_Info(char *name,char *writedata) {int i;uint8_t flag = 0,cnt = 0;struct info_t info[12];char linebuffer[256] = {0};char buffer[80];FILE *fp = fopen(STR_NETWORKCFG_FILE, "r");if(fp == NULL){printf("open error");return 1;}for(i = 0 ; i < 12 ; i++){char *ret = fgets(linebuffer, 256, fp);if(ret == NULL){break;}sscanf(linebuffer, "%[^=]=%[^=]", info[i].name,info[i].data);if(!strcmp(info[i].name, name)){memcpy(info[i].data,writedata,strlen(writedata));info[i].data[strlen(writedata)] = '\n';info[i].data[strlen(writedata)+1] = '\0';flag = 1;}memset(linebuffer,0,sizeof(linebuffer));cnt++;}fclose(fp);if(flag){fp = fopen(STR_NETWORKCFG_FILE,"w");if(fp == NULL){return 1;}for(i = 0 ; i < cnt ; i++){memset(buffer,0,sizeof(buffer));sprintf(buffer,"%s=%s",info[i].name,info[i].data);fprintf(fp,"%s",buffer);}fclose(fp);}elsereturn 1;return 0; }int main() {char result[100] = {0};char *writedata = "192.168.12.33";GetFile_Info("IP",result);printf("result:%s\n",result);ChangeFile_Info("IP",writedata);GetFile_Info("IP",result);printf("result:%s\n",result);return 0; }******************************************相關問題****************************************
******************************************************************************************
問題 1、代碼中的? %[^=]=%[^=]? ? ?什么意思???? ? ? ? ? ? ?c++中%[^,]是什么意思??? ??
一般我們是scanf("%s", xxxx),有時我們希望空格也輸入進去,可以用scanf("%[^\n]", xxxx)%[^\n]的意思就是以'\n'作為輸入的結束標志。
同理%[^,]就是以','做輸入的結束標志。
其它的如
%[a-z] 表示匹配a到z中任意字符
%[aB'] 匹配a、B、'中一員
%[^a] 匹配非a的任意字符 問題 2 、當配置文件的格式轉化為
IP? 192.168.1.20?
MASK? 255.255.255.0?
DNS? ?192.168.1.1
以上的正則應該寫成? ? ?%[^ ]? %[^ ]
當DNS 與 192.168.1.1 之間存在 \t時候,正則應該寫成:?%[^? \t]? ?%[^? \t]
**********************************工作中遇到的一個問題*******************************************
*******************************************************************************************************
問題描述:
讀取配置文件中的鍵值對,配置文件如下所示(over.conf文件):
?? ? ? ? #IP ? ?10.33
DNS 192.168.1.1
*篇日志文件中有第一行有注釋;第二行有一個空行;第三行開頭有空格 tab,鍵值對之間有空格 tab*
要求是,若某行配置文件被注釋掉,不做操作;讀出來的“IP” 要與 “ip”進行匹配,即要進行大小寫字符轉換;配置文件中有空格、還有tab匹配字符時候要考慮多種情況;配置文件每行開頭或者結尾有tab或者有空格。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdint.h>#define STR_NETWORKCFG_FILE "./over.conf"//去掉字符串 開頭 與結尾 的空格 '\t' void trim(char *strIn, char *strOut){int i, j ;i = 0;j = strlen(strIn) - 1;while(strIn[i] == ' ' || strIn[i] == '\t')++i;while(strIn[j] == ' ' || strIn[j] == '\t')--j;strncpy(strOut, strIn + i , j - i + 1);strOut[j - i + 1] = '\0'; }/*獲取指定字段(name)信息存入result中*/ int GetFile_Info(char *name,char *result) {char linebufferOld[100];char linebuffer[100];char buffer1[100] = {0};char buffer2[100] = {0};uint8_t flag = 0;int buffer_size=0;FILE *fp = fopen(STR_NETWORKCFG_FILE, "r");if(fp == NULL){printf("open error");return 1;}while(1){char *ret = fgets(linebufferOld, 100, fp);if(ret == NULL){break;}//解決配置文件 每行首位有空格或者tab的問題trim(linebufferOld,linebuffer);//解決配置文件 取鍵值時候 兩個值中間有 空格或者tab sscanf(linebuffer, "%[^ \t] \t%[^ \t]", buffer1,buffer2);if(!strcmp(name, buffer1)){buffer_size=strlen(buffer2);memcpy(result,buffer2,buffer_size);result[buffer_size-1]='\0';//remove the \nflag = 1;break;}memset(buffer1,0,sizeof(buffer1));memset(buffer2,0,sizeof(buffer2));memset(linebuffer,0,sizeof(linebuffer));}fclose(fp);if(flag != 1)return 1;return 0; }int main() {char result[100] = {0};FILE *fp = NULL;char buff[100];char temp[255];char tem[255];char *res = NULL;int i;char *ch = "IP";char *ptr,c = '#';fp = fopen(STR_NETWORKCFG_FILE, "r");if(fp == NULL){perror("This file is not exit!\n");return -1;}while(fgets(buff,100,fp) != NULL){//len=strlen(buff);//printf("%s %d\n",buff,len-1);printf("buff ==== %s\n",buff);strcpy(temp,buff);//printf("temp ==== %s\n",temp);//判斷配置文件中有無空行(其除去前后空格 tab后長度是1 則為空行 退出程序)trim(temp,tem);if(strlen(tem) == 1)continue;ptr = strchr(buff,c);//判斷此行是否有注釋 是否有“#”字符if(ptr){printf("the character %c is at :%s\n",c,ptr);continue;}else{res = strtok(temp," \t");printf("鍵res為 ==== *%s*\n",res);GetFile_Info(res,result);printf("值result為 === %s\n",result);}//被分割后的字符串temp現在是大寫 在后續的程序中需要小寫//因此在此處需要轉換for(i;i<strlen(temp);i++){if(temp[i] < 'a'){temp[i] += 32;}}printf("最終的鍵%s 值%s\n",res,result);if(!strcmp("mask",res)){printf("aaaaaaaaaa\n");}else{printf("bbbbbbbbbb\n");}printf("\n\n");}fclose(fp);return 0; }~獲取鍵值對值時候,可以在一行一行讀取文件之后,用sscanf()函數,直接獲取響應的鍵值。(后續會補充)
總結
以上是生活随笔為你收集整理的读文件 —— 读写配置文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 函数 —— fgets()
- 下一篇: 函数 —— strchr()