C语言:ini配置文件的编辑器(1)

举报
何其不顾四月天 发表于 2020/12/28 23:30:24 2020/12/28
【摘要】 前言 最近领了一个小任务,不能调用API,用C语言实现ini配置文件的读写,增删改查。一下是文件思路,相关代码片段。只是主体函数结构,功能性函数进行了说明,并没有详细到语句。随后会对小程序继续修改,一些功能增加,文本的对话框选择。 实现思路 程序流程:1、输入文件路径,存在文件打开,不存在选择是否创建。 2、文本内容的获取,将文本流存入内存中,随后对文本流操作。 ...

前言

最近领了一个小任务,不能调用API,用C语言实现ini配置文件的读写,增删改查。一下是文件思路,相关代码片段。只是主体函数结构,功能性函数进行了说明,并没有详细到语句。随后会对小程序继续修改,一些功能增加,文本的对话框选择。

实现思路

程序流程:1、输入文件路径,存在文件打开,不存在选择是否创建。
2、文本内容的获取,将文本流存入内存中,随后对文本流操作。
3、功能模块实现,增删改查,显示,保存,退出等功能实现

代码片段

1.相关结构体定义

头文件、宏定义

 #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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

.枚举变量:主要包含:控制命令,显示,增,删,改,查

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,//返回上一层
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

结构体: Elem_str 节点的子相:包含 子相名称,子相值
Elem 元素:包含 元素名称,元素个数,子相容器组。

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]; 
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

全局变量声明:文件名称,文件指针,全局唯一,实现指针的全局唯一,对指针单独操作,防止野指针问题。文件元素数组,实现对整个文本内容存储。

Elem m_Elem[Elem_Max];

FILE * file; //定义文件指针
char filename[Len_Max]; //文件路径
int elem_count = 0;//元素个数

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

2.主函数

int main(int argc, _TCHAR* argv[])
{
	printf("---------------Runing---------------\n");
	bool Working = false;
	while (Working==false)
	{
		Working = Cmd_Init();
	}	
	return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3.函数初始化:主要包含文件的打开,文件的操作

/*初始化--文件打开*/
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;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

4.文件路径获取及打开读入内存:文件名的获取,判断后缀,判断是否为ini文件,以及文件名称长度。文件读取,将文本内容写入到对应容器当中,利用元素结构,快捷的实现对文本内容的相关操作。

/*获取文件路径*/
bool GetFileName()
{	
	memset(filename,0,Len_Max);
	scanf("%s",filename);
	int len = strlen(filename);
	filename[len]='\0';
	if (len <=4) {printf("文件路径格式错误,请重新输入正确的文件路径!(注:文件格式后缀必须存在: .ini)\n");return false;}
	if (filename[len-4] == '.'&&filename[len-3]=='i'&&filename[len-2] == 'n' && filename[len-1] == 'i') return true;
	else {printf("文件路径格式错误,请重新输入正确的文件路径!(注:文件格式后缀必须存在: .ini)\n");return false;}
}

/*打开文件方式*/
bool FileOpen()
{
	file = NULL;
	file  = fopen(filename,"r");
	if (file==NULL)
	{
		printf("------------\n文件不存在,是否要创建文件\n");
		printf("0:创建;\n1:不创建\n------------\n");
		bool bCreat = GetWorking();
		if (bCreat)
		{ file  = fopen(filename,"a+"); if (file!=NULL) printf("文件创建成功\n"); return true;
		}
		return false;
	}else
	{
		printf("文件打开成功\n");
		return true;
	}	
}

/*读取文件*/
void Read_File()
{
	char buf[Item_Name_Max];
	int i = 0;
	elem_count = 0;
	while(fgets(buf,Line_Max,file) != NULL)
	{
		int len = strlen(buf);
		buf[len-1]='\0';
		if (buf[0]=='[')
		{ m_Elem[i].elem_name = new char[len-1]; memcpy(m_Elem[i].elem_name,&buf,len-1); m_Elem[i].elem_name[len-1] = '\0'; m_Elem[i].elem_count=0;
	//		printf("elem_name:%s\n",m_Elem[i].elem_name); elem_count ++; i++;
		}else
		{ int key_i = 0;int value_i = 0; bool flag = false; for (int j = 0;j<len;j++) { if (buf[j] == '=')	{flag = true;continue;} if (flag == false) { m_Elem[i-1].m_Elem_str[m_Elem[i-1].elem_count].item_name[key_i] = buf[j];key_i++; }else { m_Elem[i-1].m_Elem_str[m_Elem[i-1].elem_count].item_str[value_i] = buf[j];value_i++; } }
	//		printf("Key:%s Value:%s\n",m_Elem[i-1].m_Elem_str[Elem_num].item_name,m_Elem[i-1].m_Elem_str[Elem_num].item_str); m_Elem[i-1].elem_count++;
		}
	}	
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

5.主体功能模块:主要功能有,文件显示,增,删,改,查,文件保存,程序退出,返回上一层

/*对文件进行的操作*/
bool Cmd_FileCtrl()
{
	bool WokingState = true;
	bool ChildWorking = true;
	printf("\n------------\n0:显示文件内容;\n1:增加文件内容;\n2.删除文件内容;\n3.修改文件内容;\n4.查找文件内容;\n5.保存文件;\n6.程序退出;\n7:帮助;\n8:软件信息;\nOther:返回上一层\n------------\n");
	int Cmd = 0;
	int iCmd = 0;
	Cmd = CmdVal();
	switch(Cmd)
	{
	case Show:
		while(ChildWorking)
		{ printf("------------\n0:显示元素个数;\n1:显示元素名称;\n2:显示文本全部内容;\n3:返回上一层;\n------------\n"); iCmd = CmdVal(); ChildWorking = Cmd_ShowFile(iCmd);
		}
		break;
	case Add:
		while(ChildWorking)
		{ printf("------------\n0:指定位置增加元素;\n1.元素指定位置增加子相;\n2.返回上一层;\n------------\n"); iCmd = CmdVal(); ChildWorking = Cmd_Add(iCmd);
		}
		break;
	case Del:
		while (ChildWorking)
		{ printf("------------\n0:删除指定元素;\n1:删除元素指定相;\n2.返回上一层;\n------------\n"); iCmd = CmdVal(); ChildWorking = Del_Cmd(iCmd);
		}
		break;
	case Modify:
		while (ChildWorking)
		{ printf("------------\n0:修改元素名称;\n1:修改元素指定子相;\n2:修改指定元素子相名称;\n3:修改指定元素子相值;\n4.返回上一层\n------------\n"); iCmd = CmdVal(); ChildWorking = Cmd_Modify(iCmd);
		}
		break;
	case Search:
		while(ChildWorking)
		{ printf("------------\n0:根据元素名查找元素;\n1:根据元素子相名查找对应子相;\n2:根据元素子相值查找对应子相;\n3.模糊查找;\n4.返回上一层\n------------\n"); iCmd = CmdVal(); ChildWorking = Cmd_Search(iCmd);
		}
		break;
	case Save:
		printf("------------\n正在保存文件\n");
		if(File_Write() == true) printf("文件保存成功!\n------------\n"); else printf("文件保存失败!\n------------\n");
		printf("0:继续;other:退出\n");
		WokingState =GetWorking();
		break;
	case Quit:
		printf("正在退出\n");
		file = NULL;
		elem_count = 0;
		memset(&m_Elem,0,sizeof(m_Elem));
		exit(1);
		break;
	case Help:
		printf("操作信息\n");
		printf("软件介绍:\t软件主要实现(.ini)文件的编辑,主要包括文件的创建、增、删、改、查。\n\t创建:如果没有对应文件,则会有创建文件选项。\n");
		printf("\t增:主要有元素节点的增加、元素子相的增加。 \n\t删:主要有元素节点得到删除、元素子相节点的删除。\n");
		printf("\t改:主要有元素节点名称修改,元素子相修改,元素子相名称修改,元素子相值修改\n");
		printf("\t查:主要有根据元素名称查找对应元素、根据元素子相名称查找对应子相、根据子相值查找对应子相、模糊查找。(注:查找为全字符匹配)\n");
		printf("操作方式:\t根据提示信息输入对应键值即可进行相应操作。\t");
		break;
	case Info:
		printf("软件名:配置信息文件(.ini)编辑软件\n软件版本:V0.1\n创建时间:2019.05.12\n作者:wq\n");
		break;
	default:
		file = NULL;
		memset(&m_Elem,0,sizeof*(m_Elem));
		WokingState =false;
		printf("正在返回上一层\n");
		break;
	}
	return WokingState;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

显示:包含,显示文件元素个数,元素名称,全部文本内容

bool Cmd_ShowFile(int ShowFlag)
{
	bool Working = true;
	switch(ShowFlag)
	{
	case ShowElemCount:
		printf("元素个数为:%d\n",elem_count);
		Working = true;
		break;
	case ShowElemName:
		for (int i = 0 ;i<elem_count;i++)
		{ printf("Elem_Name:%s\n",m_Elem[i].elem_name);
		}
		Working = true;
		break;
	case ShowElemStr:
		for (int i = 0 ;i<elem_count;i++)
		{ printf("Elem_Name:%s\n",m_Elem[i].elem_name); int Count = m_Elem[i].elem_count; for(int j = 0;j<Count;j++) { printf("Key:%s Value:%s\n",m_Elem[i].m_Elem_str[j].item_name,m_Elem[i].m_Elem_str[j].item_str); } }
		Working = true;
		break;
	case ShowBack:
		Working = false;
		break;
	default:
		printf("------------\n无效操作符!是否返回上一层!\n0:继续;other:返回\n------------\n");
		Working = GetWorking();
		break;
	}
	return Working;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

增:包含,增加元素,增加元素子相,元素单次只能增加一个,子相可以增加多个。在增加元素时,首先选择元素插入节点位置,其他元素移位,从末尾向后移位,依次处理

bool Cmd_Add(int AddFlag)
{
	bool working = true;
	int iElemPos = 0;
	char * elem_name;
	int iItemCount = 0;
	char  cItemName[Item_Name_Max],cItemValue[Item_Value_Max];
	int iItemPos = 0;
	switch(AddFlag)
	{
	case AddElem:
		printf("请输入元素写入位置\n");
		iElemPos = InputVal();
		if (iElemPos>=elem_count)
		{ iElemPos = elem_count;
		}
		if(iElemPos < elem_count)
		{ for (int i = elem_count;i>iElemPos;i--) { memset(&m_Elem[i],0,sizeof(Elem)); m_Elem[i].elem_name = new char[Item_Name_Max]; char * buf_name	 = new char[strlen(m_Elem[i-1].elem_name)]; buf_name = m_Elem[i-1].elem_name; memcpy(&m_Elem[i].elem_name,&m_Elem[i-1].elem_name,strlen(m_Elem[i-1].elem_name)); m_Elem[i].elem_name[strlen(m_Elem[i-1].elem_name)] = '\0'; m_Elem[i].elem_count = m_Elem[i-1].elem_count; for(int j = 0;j<m_Elem[i-1].elem_count;j++) { memcpy(&m_Elem[i].m_Elem_str[j].item_name,&m_Elem[i-1].m_Elem_str[j].item_name,strlen(m_Elem[i-1].m_Elem_str[j].item_name)); memcpy(&m_Elem[i].m_Elem_str[j].item_str,&m_Elem[i-1].m_Elem_str[j].item_str,strlen(m_Elem[i-1].m_Elem_str[j].item_str)); m_Elem[i].m_Elem_str[j].item_name[strlen(m_Elem[i-1].m_Elem_str[j].item_name)]='\0'; m_Elem[i].m_Elem_str[j].item_str[strlen(m_Elem[i-1].m_Elem_str[j].item_str)]='\0'; } }
		}else
		{ memset(&m_Elem[iElemPos],0,sizeof(Elem)); m_Elem[iElemPos].elem_name = new char[Item_Name_Max];
		} printf("请输入元素名字,元素子相个数\n"); elem_name = new char[Item_Name_Max]; scanf("%s",elem_name); m_Elem[iElemPos].elem_name = new char(strlen(elem_name)); memcpy(m_Elem[iElemPos].elem_name,elem_name,strlen(elem_name)); m_Elem[iElemPos].elem_name[strlen(elem_name)] = '\0'; elem_name = NULL; iItemCount = InputVal(); if(iItemCount>Elem_Item_Max) iItemCount = Elem_Item_Max; m_Elem[iElemPos].elem_count = iItemCount; for (int j = 0;j<iItemCount;j++) { printf("请输入第%d个子相,子相名称,子相值\n",j); memset(&m_Elem[iElemPos].m_Elem_str[j],0,sizeof(Elem_str)); scanf("%s",m_Elem[iElemPos].m_Elem_str[j].item_name); scanf("%s",m_Elem[iElemPos].m_Elem_str[j].item_str); m_Elem[iElemPos].m_Elem_str[j].item_name[strlen(m_Elem[iElemPos].m_Elem_str[j].item_name)]='\0'; m_Elem[iElemPos].m_Elem_str[j].item_str[strlen(m_Elem[iElemPos].m_Elem_str[j].item_str)] = '\0'; } elem_count++;
		working = true; break;
	case AddElem_Item:
		printf("请输入增加子相元素位置\n");
		iElemPos = InputVal();
		if (iElemPos>=elem_count)
		{ break;
		}else
		{ printf("请输入插入子相位置\n"); iItemPos = InputVal(); if (iItemPos>=m_Elem[iElemPos].elem_count) { iItemPos = m_Elem[iElemPos].elem_count; } for (int i = m_Elem[iElemPos].elem_count;i>iItemPos;i--) { memcpy(&m_Elem[iElemPos].m_Elem_str[i].item_name,&m_Elem[iElemPos].m_Elem_str[i-1].item_name,strlen(m_Elem[iElemPos].m_Elem_str[i-1].item_name)); memcpy(&m_Elem[iElemPos].m_Elem_str[i].item_str,&m_Elem[iElemPos].m_Elem_str[i-1].item_str,strlen(m_Elem[iElemPos].m_Elem_str[i-1].item_str)); m_Elem[iElemPos].m_Elem_str[i].item_name[strlen(m_Elem[iElemPos].m_Elem_str[i-1].item_name)]='\0'; m_Elem[iElemPos].m_Elem_str[i].item_str[strlen(m_Elem[iElemPos].m_Elem_str[i-1].item_str)]='\0'; } printf("请输入插入子相名称,子相值\n"); memset(&m_Elem[iElemPos].m_Elem_str[iItemPos],0,sizeof(Elem_str)); scanf("%s",&m_Elem[iElemPos].m_Elem_str[iItemPos].item_name); scanf("%s",&m_Elem[iElemPos].m_Elem_str[iItemPos].item_str); m_Elem[iElemPos].m_Elem_str[iItemPos].item_name[strlen(m_Elem[iElemPos].m_Elem_str[iItemPos].item_name)]='\0'; m_Elem[iElemPos].m_Elem_str[iItemPos].item_str[strlen(m_Elem[iElemPos].m_Elem_str[iItemPos].item_str)]='\0'; m_Elem[iElemPos].elem_count++;
		}
		working = true;
		break;
	case AddBack:
		working = false;
		break;
	default:
		printf("------------\n无效操作符!是否返回上一层!\n0:继续;other:返回\n------------\n");
		working = GetWorking();
		break;
	}
	delete elem_name;
	elem_name = NULL;
	return working;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107

删:包含,删除元素,删除子相

/*删除操作*/
bool Del_Cmd(int DelFlag)
{
	int iElem_Pos=0;
	int iItem_Pos=0;
	bool Working = true;
	switch(DelFlag)
	{
	case DelElem:
		printf("请输入删除元素位置\n");
		iElem_Pos = InputVal();
		if(iElem_Pos>=elem_count) {printf("此位置无元素\n");break;} memset(&m_Elem[iElem_Pos],0,sizeof(Elem));
		if (iElem_Pos == elem_count-1){elem_count--;break;} for(int i = iElem_Pos;i<elem_count-1;i++)
		{ if(m_Elem[i].elem_name == NULL) m_Elem[i].elem_name =new char[Item_Name_Max]; else{ memset(m_Elem[i].elem_name,0,strlen(m_Elem[i+1].elem_name)); m_Elem[i].elem_name =new char[Item_Name_Max]; } memcpy(m_Elem[i].elem_name,m_Elem[i+1].elem_name,strlen(m_Elem[i+1].elem_name)); m_Elem[i].elem_name[strlen(m_Elem[i+1].elem_name)] = '\0'; m_Elem[i].elem_count = m_Elem[i+1].elem_count; for(int j = 0;j<m_Elem[i+1].elem_count;j++) { memcpy(&m_Elem[i].m_Elem_str[j].item_name,&m_Elem[i+1].m_Elem_str[j].item_name,strlen(m_Elem[i+1].m_Elem_str[j].item_name)); memcpy(&m_Elem[i].m_Elem_str[j].item_str,&m_Elem[i+1].m_Elem_str[j].item_str,strlen(m_Elem[i+1].m_Elem_str[j].item_str)); m_Elem[i].m_Elem_str[j].item_name[strlen(m_Elem[i+1].m_Elem_str[j].item_name)]='\0'; m_Elem[i].m_Elem_str[j].item_str[strlen(m_Elem[i+1].m_Elem_str[j].item_str)]='\0'; }
		}
		memset(&m_Elem[elem_count-1],0,sizeof(Elem));
		elem_count--;
		Working = true;
		break;
	case DelElem_Item:
		printf("请输入元素位置,删除相位置\n");
		iElem_Pos = InputVal();
		if(iElem_Pos>=elem_count) {printf("该位置不存在元素\n");break;}
		iItem_Pos = InputVal();
		if(iItem_Pos>=m_Elem[iItem_Pos].elem_count) {printf("该位置不存在子相\n");break;}
		memset(&m_Elem[iElem_Pos].m_Elem_str[iItem_Pos],0,sizeof(Elem_str));
		for(int i = iItem_Pos;i<m_Elem[iItem_Pos].elem_count-1;i++)
		{ memcpy(&m_Elem[iElem_Pos].m_Elem_str[i].item_name,&m_Elem[iElem_Pos].m_Elem_str[i+1].item_name,strlen(m_Elem[iElem_Pos].m_Elem_str[i+1].item_name)); memcpy(&m_Elem[iElem_Pos].m_Elem_str[i].item_str,&m_Elem[iElem_Pos].m_Elem_str[i+1].item_str,strlen(m_Elem[iElem_Pos].m_Elem_str[i+1].item_str)); m_Elem[iElem_Pos].m_Elem_str[i].item_name[strlen(m_Elem[iElem_Pos].m_Elem_str[i+1].item_name)]='\0'; m_Elem[iElem_Pos].m_Elem_str[i].item_str[strlen(m_Elem[iElem_Pos].m_Elem_str[i+1].item_str)]='\0';
		}
		memset(&m_Elem[iElem_Pos].m_Elem_str[elem_count-1],0,sizeof(Elem_str));
		m_Elem[iItem_Pos].elem_count--;
		Working = true;
		break;
	case DelBack:
		Working = false;
		break;
	default:
		printf("------------\n未识别命令,是否返回上一层!\n0:继续;other:返回\n------------\n");
		Working = GetWorking();
		break;
	}
	return Working;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

改:实现整个元素修改,子相修改,子相名称修改,子相值修改

   /*修改*/ bool Cmd_Modify(int iModify) { int iElem_Pos = 0; int iItem_Pos = 0; char Elem_name[Item_Name_Max]; char Item_Name[Item_Name_Max]; char Item_Value[Item_Value_Max]; bool Working = true; switch(iModify) { case ModifyElem_Name: printf("请输入修改元素位置\n"); iElem_Pos = InputVal(); if(iElem_Pos>=elem_count) {printf("元素不存在\n");break;} printf("请输入元素名称\n"); scanf("%s",Elem_name); memcpy(m_Elem[iElem_Pos].elem_name,&Elem_name,strlen(Elem_name)); m_Elem[iElem_Pos].elem_name[strlen(Elem_name)] = '\0'; Working = true; break; case ModifyElem_Item: printf("请输入修改元素位置\n"); iElem_Pos = InputVal(); if(iElem_Pos>=elem_count) {printf("元素不存在\n");break;} printf("请输入修改子相位置\n"); iItem_Pos = InputVal(); if (iItem_Pos>=m_Elem[iElem_Pos].elem_count)	{printf("元素子相不存在\n");break;} printf("请输入修改子相名称\n"); scanf("%s",Item_Name); memcpy(&m_Elem[iElem_Pos].m_Elem_str[iItem_Pos].item_name,&Item_Name,strlen(Item_Name)); m_Elem[iElem_Pos].m_Elem_str[iItem_Pos].item_name[strlen(Item_Name)] = '\0'; printf("请输入修改子相值\n"); scanf("%s",Item_Value); memcpy(&m_Elem[iElem_Pos].m_Elem_str[iItem_Pos].item_str,&Item_Value,strlen(Item_Value)); m_Elem[iElem_Pos].m_Elem_str[iItem_Pos].item_str[strlen(Item_Value)] = '\0'; Working = true; break; case ModifyElem_Item_Name: printf("请输入修改元素位置\n"); iElem_Pos = InputVal(); if(iElem_Pos>=elem_count) {printf("元素不存在\n");break;} printf("请输入修改子相位置\n"); iItem_Pos = InputVal(); if (iItem_Pos>=m_Elem[iElem_Pos].elem_count)	{printf("元素子相不存在\n");break;} printf("请输入修改子相名称\n"); scanf("%s",Item_Name); memcpy(&m_Elem[iElem_Pos].m_Elem_str[iItem_Pos].item_name,&Item_Name,strlen(Item_Name)); m_Elem[iElem_Pos].m_Elem_str[iItem_Pos].item_name[strlen(Item_Name)] = '\0'; Working = true; break; case ModifyElem_Item_Value: printf("请输入修改元素位置\n"); iElem_Pos = InputVal(); if(iElem_Pos>=elem_count) {printf("元素不存在\n");break;} printf("请输入修改子相位置\n"); iItem_Pos = InputVal(); if (iItem_Pos>=m_Elem[iElem_Pos].elem_count)	{printf("元素子相不存在\n");break;} printf("请输入修改子相值\n"); scanf("%s",Item_Value); memcpy(&m_Elem[iElem_Pos].m_Elem_str[iItem_Pos].item_str,&Item_Value,strlen(Item_Value)); m_Elem[iElem_Pos].m_Elem_str[iItem_Pos].item_str[strlen(Item_Value)] = '\0'; Working = true; break; case ModifyBack: Working = false; break; default: printf("------------\n无效操作符!是否返回上一层!\n0:继续;other:返回\n------------\n"); Working = GetWorking(); break; } return Working; }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

查找:指定查找:元素名称查找,子相值查找,子相名称查找。模糊查找:.目前只实现全字匹配,大小写匹配

/*查找*/
bool Cmd_Search(int iSearch)
{
	char * Search_str = new char[Item_Name_Max];
	bool bFlag = false;
	bool Working = true;
	switch(iSearch)
	{
	case SearchElem:
		printf("请输入需要查找元素名称\n");
		scanf("%s",Search_str);
		Search_str[strlen(Search_str)] = '\0';
		while(Search_str[0] != '[' || Search_str[strlen(Search_str)-1] != ']')
		{ printf("请重新输入需要查找元素名称\n"); scanf("%s",Search_str); Search_str[strlen(Search_str)] = '\0';
		} for (int i = 0 ;i<elem_count;i++)
		{ if(strcmp(m_Elem[i].elem_name,Search_str)==0) { bFlag = true; printf("元素位置:%d\n元素名称:%s\n",i,m_Elem[i].elem_name); for(int j = 0;j<m_Elem[i].elem_count;j++) { printf("Key:%s Value:%s\n",m_Elem[i].m_Elem_str[j].item_name,m_Elem[i].m_Elem_str[j].item_str); } }
		}
		if (bFlag==false) printf("不存在此元素\n");
		Working = true;
		break;
	case SearchElem_Item_Name:
		printf("请输入需要查找子相名称\n");
		scanf("%s",Search_str);
		Search_str[strlen(Search_str)] = '\0';
		for (int i = 0 ;i<elem_count;i++)
		{ for(int j = 0;j<m_Elem[i].elem_count;j++) { if(strcmp(m_Elem[i].m_Elem_str[j].item_name,Search_str)==0) { bFlag = true; printf("元素位置:%d,元素名称:%s\n",i,m_Elem[i].elem_name); printf("Key:%s Value:%s\n",m_Elem[i].m_Elem_str[j].item_name,m_Elem[i].m_Elem_str[j].item_str); } } }
		if (bFlag==false) printf("不存在此元素\n");
		Working = true;
		break;
	case SearchElem_Item_value:
		printf("请输入需要查找子相值\n");
		scanf("%s",Search_str);
		Search_str[strlen(Search_str)] = '\0';
		for (int i = 0 ;i<elem_count;i++)
		{ for(int j = 0;j<m_Elem[i].elem_count;j++) { if(strcmp(m_Elem[i].m_Elem_str[j].item_str,Search_str)==0) { bFlag = true; printf("元素位置:%d,元素名称:%s\n",i,m_Elem[i].elem_name); printf("Key:%s Value:%s\n",m_Elem[i].m_Elem_str[j].item_name,m_Elem[i].m_Elem_str[j].item_str); } } }
		if (bFlag==false) printf("不存在此元素\n");
		Working = true;
		break;
	case SearchWord:
		printf("请输入搜索值\n");
		scanf("%s",Search_str);
		Search_str[strlen(Search_str)] = '\0';
		if(Search_str[0] == '[' && Search_str[strlen(Search_str)-1] == ']')
		{ for (int i = 0 ;i<elem_count;i++) { if(strcmp(m_Elem[i].elem_name,Search_str)==0) { bFlag = true; printf("元素名称相同,元素位置:%d\n元素名称:%s\n",i,m_Elem[i].elem_name); for(int j = 0;j<m_Elem[i].elem_count;j++) { printf("Key:%s Value:%s\n",m_Elem[i].m_Elem_str[j].item_name,m_Elem[i].m_Elem_str[j].item_str); } } }
		}else
		{ for (int i = 0 ;i<elem_count;i++) { for(int j = 0;j<m_Elem[i].elem_count;j++) { if(strcmp(m_Elem[i].m_Elem_str[j].item_name,Search_str)==0) { bFlag = true; printf("元素子相名称相同,元素位置:%d,元素名称:%s\n",i,m_Elem[i].elem_name); printf("Key:%s Value:%s\n",m_Elem[i].m_Elem_str[j].item_name,m_Elem[i].m_Elem_str[j].item_str); } if(strcmp(m_Elem[i].m_Elem_str[j].item_str,Search_str)==0) { bFlag = true; printf("元素子相值相同,元素位置:%d,元素名称:%s\n",i,m_Elem[i].elem_name); printf("Key:%s Value:%s\n",m_Elem[i].m_Elem_str[j].item_name,m_Elem[i].m_Elem_str[j].item_str); } } }
		}
		if (bFlag==false) printf("不存在此元素\n");
		Working = true;
		break;
	case SearchBack:
		Working = false;
		break;
	default:
		printf("------------\n无效操作符!是否返回上一层!\n0:继续;other:返回\n------------\n");
		Working = GetWorking();
		break;
	}
	delete Search_str;
	Search_str = NULL;
	return Working;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126

文件写入:只有做文件写入操作时,才会实现对文本内容的修改,其他操作只是对内存操作,对应保存功能。文件写入是将容器内容直接写入文本。

/*写入文件*/
bool File_Write()
{
	bool state = false;
	fclose(file);
	file  = fopen(filename,"w+");
	for (int i = 0 ;i<elem_count;i++)
	{ fprintf(file,"%s\n",m_Elem[i].elem_name);
		for(int j = 0;j<m_Elem[i].elem_count;j++)
		{ fprintf(file,"%s=%s\n",m_Elem[i].m_Elem_str[j].item_name,m_Elem[i].m_Elem_str[j].item_str); if(i==elem_count-1 && j==m_Elem[i].elem_count-1) state = true;
		} }
	fclose(file);
	return state;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

6.辅助函数
字符串输入检测,兼容误输

/*输入字符转换,兼容误输*/
int InputVal()
{
	int outputval =0;
	char * input = new char[Int_Len];
	unsigned int initPos = 0;	
	scanf("%s",input);
	int len =  strlen(input);
	if(input[0] == '+' || input[0] =='-') {initPos =1;len = len-1;} else initPos = 0;
	for (int i = initPos;i<strlen(input);i++)
	{
		if(input[i]>='0'&&input[i]<='9') outputval = outputval*10+int(input[i])-0x30;
		else return 0;
	}
	if(input[0] == '-') outputval = 0;
	delete input;input = NULL;
	return outputval;
}

/*Cmd检测*/
int CmdVal()
{
	char * input = new char[Int_Len];
	int iOutput = 0;
	scanf("%s",input);
	int len =  strlen(input);
	if(input[0]>='0'&& input[0]<='8' && len ==1) iOutput = input[0]-0x30;
	else iOutput = -1;	
	delete input;input = NULL;
	return iOutput;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

工作状态获取

bool GetWorking()
{
	char * input = new char[2];	
	scanf("%s",input);
	int len =  strlen(input);
	if(input[0]=='0' && len ==1) {delete input;input =NULL;return true;}
	else {delete input;input =NULL;return false;}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其他:字符串补位,计划实现功能,对元素名称输入时,实现对元素名称的检测。

/*字符串补位,第一位填'[',最后一位填']'*/
void str_Move(char * str,int len,bool flag)
{
	if (flag)
	{ str[len]= '\0';str[len+1] = '\0';
		len ++;
		for(int i = len-1;i>0;i--)
		{ str[i] = str[i-1];
		}
		str[0] = '[';
	}else
	{
		len ++;
		str[len-1] = ']';
		str[len] = '\0';
	}
}
/*文件名称检测*/
void ElemName_Modify(char* name,int len)
{
	if (name[0]!='[')
	{
		str_Move(name,len,true);
	}else if(name[len-1] != ']')
	{
		str_Move(name,len,false);
	}
}


bool ElemName_Check(char * name,int len)
{
	if(name[0] == '[' && name[len-1] == ']') return true;
	else return false;
}

/*int 输入字符越界判断*/
bool IntputCheck(int intputVal)
{
	if (intputVal>MAX_INPUT || intputVal<MIN_INPUT )	return false;
	return true;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

源码:

源码

文章来源: blog.csdn.net,作者:何其不顾四月天,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/u011218356/article/details/90709260

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。