前言
最近领了一个小任务,不能调用API,用C语言实现ini配置文件的读写,增删改查。一下是文件思路,相关代码片段。只是主体函数结构,功能性函数进行了说明,并没有详细到语句。随后会对小程序继续修改,一些功能增加,文本的对话框选择。
实现思路
程序流程:1、输入文件路径,存在文件打开,不存在选择是否创建。 2、文本内容的获取,将文本流存入内存中,随后对文本流操作。 3、功能模块实现,增删改查,显示,保存,退出等功能实现
代码片段
1.相关结构体定义
头文件、宏定义
代码语言:javascript复制 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _TCHAR char
#define Len_Max 255 //路径最大长度
#define Line_Max 1024 //最大行数
#define Elem_Max 255 //元素最大个数
#define Elem_Item_Max 255 //元素相最大个数
#define Item_Name_Max 55 //Item Key 最大长度
#define Item_Value_Max 55 //Item Value 最大长度
#define Int_Len 12 //整形长度
#define MAX_INPUT 4294967297
#define MIN_INPUT -4294967298
.枚举变量:主要包含:控制命令,显示,增,删,改,查
代码语言:javascript复制enum CtrlCmd{
Show=0, //显示
Add,//增
Del,//删
Modify,//改
Search,//查
Save,//保存文件
Quit,//退出
Help,//帮助
Info,//软件信息
};
enum ShowCmd{
ShowElemCount=0,//显示元素个数
ShowElemName,//显示元素名称
ShowElemStr, //显示文本内容
ShowBack,//返回上一层
};
enum AddCmd{
AddElem=0, //指定位置增加元素
AddElem_Item, //元素指定位置增加子相
AddBack,//返回上一层
};
enum DelCmd{
DelElem=0,//删除指定元素
DelElem_Item,//删除元素指定相
DelBack,//返回上一层
};
enum ModifyCmd{
ModifyElem_Name=0,//修改元素名称
ModifyElem_Item, //修改指定元素指定子相
ModifyElem_Item_Name,//修改指定元素子相名称
ModifyElem_Item_Value,//修改指定元素子相值
ModifyBack,//返回上一层
};
enum SearchCmd{
SearchElem=0,//根据元素名查找元素
SearchElem_Item_Name,//根据元素子相名查找对应子相
SearchElem_Item_value,//根据元素子相值查找对应子相
SearchWord,//根据字符串查找,模糊查找
SearchBack,//返回上一层
};
结构体: Elem_str 节点的子相:包含 子相名称,子相值 Elem 元素:包含 元素名称,元素个数,子相容器组。
代码语言:javascript复制struct Elem_str{
char item_name[Item_Name_Max];
char item_str[Item_Value_Max];
};
struct Elem{
char * elem_name;
int elem_count;
Elem_str m_Elem_str[Elem_Item_Max];
};
全局变量声明:文件名称,文件指针,全局唯一,实现指针的全局唯一,对指针单独操作,防止野指针问题。文件元素数组,实现对整个文本内容存储。
代码语言:javascript复制Elem m_Elem[Elem_Max];
FILE * file; //定义文件指针
char filename[Len_Max]; //文件路径
int elem_count = 0;//元素个数
2.主函数
代码语言:javascript复制int main(int argc, _TCHAR* argv[])
{
printf("---------------Runing---------------n");
bool Working = false;
while (Working==false)
{
Working = Cmd_Init();
}
return 0;
}
3.函数初始化:主要包含文件的打开,文件的操作
代码语言:javascript复制/*初始化--文件打开*/
bool Cmd_Init()
{
bool Working = true;
printf("------------n0:继续;1:退出n------------n");
int iCtrlFlag = -1;
char CtrlFlag[Len_Max] ;
while(iCtrlFlag == -1)
{
scanf("%s",CtrlFlag);
if (CtrlFlag[0] == '0')
iCtrlFlag = 0;
else if (CtrlFlag[0] == '1')
iCtrlFlag =1;
else{
iCtrlFlag = -1;
printf("输出指令错误!请重新输入n");
}
}
if (iCtrlFlag == 1) {
file = NULL;
memset(&m_Elem,0,sizeof(m_Elem));
exit(1);
}
printf("请输入文件路径(注:相对路径或者绝对路径)n");
while(GetFileName() == false);
if(FileOpen() == false) return false;
Read_File();
while(Working)
{
Working = Cmd_FileCtrl();
}
return Working;
}
4.文件路径获取及打开读入内存:文件名的获取,判断后缀,判断是否为ini文件,以及文件名称长度。文件读取,将文本内容写入到对应容器当中,利用元素结构,快捷的实现对文本内容的相关操作。
代码语言:javascript复制/*获取文件路径*/
bool GetFileName()
{
memset(filename,0,Len_Max);
scanf("%s",filename);
int len = strlen(filename);
filename[len]='