xe7中实现重写ini文件的一个section

小岗哥哥 2016-11-23 09:17:39
我在给一个硬件设备写一个ini文件的配置软件,有一个section需要能同时修改key和value,但是ini文件如果只是用WriteString写入的话,如果value值不变,我修改了KEY,原来的元素还在,读取的时候会出问题
如果我erasesection的话,原来的SECTION在文件中的位置会发生变化,硬件里面的解析程序比较局限,只能按顺序解析,做硬件程序的不愿意改,因为是电气公司,很多产品已经上线涉及到维护,所以只能我这里更改,
想请教下各位大神:
有没有什么方法能删除SECTION中的某一组KEY和value?
或者section下的内容全部删除,我自己再重写?
多谢!
...全文
117 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
小岗哥哥 2016-11-23
  • 打赏
  • 举报
回复
引用 3 楼 ccrun 的回复:
TIniFile 类有 DeleteKey 方法。
我如果只是deletekey,可以清掉,如果deletekey之后再把表格的数据写进文件,就不行了

pif = new TIniFile(FileName);
	map <int,AnsiString > mapint;
	map <int,AnsiString>::iterator m_iter;
	TStrings *stringlist = new TStringList(NULL);    //创建TString对象;
	if(dxtbcntnrdckst1->ActiveChildIndex==0)  //采集表
	{
	   if(cxPageControl1->ActivePageIndex==0) //单点遥信
	   {
		   pif->WriteInteger("CollectTable","SPSignalNum",cxspndt1->Text.ToInt());
		   for(int i =0;i<collectYX->RowCount-1;i++)
		   {
			 mapint.insert(make_pair(StrToInt(collectYX->Cells[1][i+1]),collectYX->Cells[2][i+1]));
		   }
		   //判断 arrinerid[i]中有无重复点号;
		   if(mapint.size()!=(collectYX->RowCount-1))
		   {
				ShowMessage("采集点表内部点号不允许有重复,请检查后修改!");
				return ;
			}
		  //先遍历ini文件区,用DELETEkey方法,将原采集表单点遥信区清空;
		  pif->ReadSection("CollectTable.SPSignalName", stringlist) ;
		  int valueNum = stringlist->Count;    //获取该区元素个数;
		   for (i = 0; i  <valueNum; i++)       //遍历,清除该区元素,
			{
			 pif->DeleteKey("CollectTable.SPSignalName",stringlist->Names[i]);
			}
			pif->UpdateFile();
		   for(m_iter = mapint.begin(); m_iter != mapint.end();m_iter++)
		   {
			  pif->WriteString("CollectTable.SPSignalName",m_iter->first,m_iter->second) ;
		   }

	   }

小岗哥哥 2016-11-23
  • 打赏
  • 举报
回复
引用 3 楼 ccrun 的回复:
TIniFile 类有 DeleteKey 方法。
deletekey昨天也看到了,试了下不行,现在单独开了个代码试了下可以,还是自己太粗心,看到deletekey就以为只是删除key,对value不起作用,多谢! 现在我只需要遍历下这个区,然后再把表格里面填写的值用mapinsert到map里,然后再迭代写进去就可以了
小岗哥哥 2016-11-23
  • 打赏
  • 举报
回复
引用 2 楼 zhgwbzhd 的回复:
他按照顺序,你也按照顺序新建一个即可。 为了保证绝对和他们的顺序一致,每一次修改时,你先把所有的数据都读出来,把ini文件删除了,一条一条的写,肯定按照自己的顺序完成。
原来的INI文件挺大的,关键是用什么方法按照顺序在写回去,存在什么里面?
ccrun.com 2016-11-23
  • 打赏
  • 举报
回复
TIniFile 类有 DeleteKey 方法。
zhgwbzhd 2016-11-23
  • 打赏
  • 举报
回复
他按照顺序,你也按照顺序新建一个即可。 为了保证绝对和他们的顺序一致,每一次修改时,你先把所有的数据都读出来,把ini文件删除了,一条一条的写,肯定按照自己的顺序完成。
小岗哥哥 2016-11-23
  • 打赏
  • 举报
回复
@annhoo
小岗哥哥 2016-11-23
  • 打赏
  • 举报
回复
引用 7 楼 ccrun 的回复:
你说的这个不行,是啥意思?怎么个不行呢?
我粗心了,之前试验用的ReadSectionvalues,后来写进代码是马虎写成了ReadSection,所以没清掉,多谢版主!
ccrun.com 2016-11-23
  • 打赏
  • 举报
回复
你说的这个不行,是啥意思?怎么个不行呢?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧