考虑以下文件内容
[channels]
usecallerid=yes
cidsignalling=dtmf
cidstart=dtmf
;group=0
usecallerid=yes
context=pstn-channels
channel=>5
;group=0
usecallerid=yes
context=pstn-channels
channel=>6
;group=0
usecallerid=yes
context=pstn-channels
channel=>7
;group=1
context=phone-channels
channel=>1-4
我只想搜索一个频道并使用 C++ 更改该频道的某些属性。关键是每个通道的属性都写在“通道”关键字上方。例如,我需要将频道 5 的上下文属性更改为电话。我该怎么做?
编辑:
所以我终于找到了办法。我逐行读取文件,寻找“group”关键字,在达到这个关键字后,我开始将每一行推回一个字符串向量,直到我到达包含“channel”关键字的行。然后我用“=”分隔符分割最后一行并将单元格编号1与“portNumber”进行比较,然后如果它们匹配,我搜索字符串向量(以“group”开头并以“channel”关键字结尾的数据块)对于用户想要更改的属性,在找到该属性后,我计算适当的偏移量以使用 seekg 函数更改文件的指针位置,然后写入数据。但问题是每一行的字符数量是有限的,也就是说,当插入更长的行时,其他行会丢失。
;group=0
usecallerid=yes
context=pstn-channels
channel=>131
如果我想将此行更改为“context=phone-channels”,结果将是
;group=0
usecallerid=n
context=phone-channels
channel=>130
如您所见,第二行得到了错误的值。我认为在编辑之前在每行末尾添加一些空格会很有用,它可以工作,但我认为这不是一个有效的解决方案。所以你怎么看?我希望问题和问题对您来说很清楚......
这是代码
bool changeConfigFiles(string addr, int portNumber, string key, string value)
{
//
char cmd[200];
fstream targetFile(addr.c_str());
string lines;
int offset=0,pPosition;
vector<string> helper,anotherHelper;
vector<string> contentsBlock;
//
if (!targetFile.is_open())
{
return false;
}
//
while(getline(targetFile, lines))
{
if(lines.find("group") != string::npos)
{
pPosition = targetFile.tellg();
pPosition -= lines.length();
contentsBlock.push_back(lines);
while(getline(targetFile, lines))
{
if(lines.find("=>") != string::npos)
{
helper = explode("=>",lines);
contentsBlock.push_back(lines);
break;
}
contentsBlock.push_back(lines);
}
}
//
if(helper.size() !=0 && strToInt(helper[1]) == portNumber)
{
for(int i=0;i<contentsBlock.size();i++)
{
if(contentsBlock[i].find(key) != string::npos)
{
anotherHelper = explode("=",contentsBlock[i]);
targetFile.seekg(pPosition+offset-1);
targetFile << endl << anotherHelper[0] << "=" << value << endl;
}
offset += contentsBlock[i].length();
}
//
helper.clear();
targetFile.seekg(pPosition+offset);
}
contentsBlock.clear();
}
targetFile.close();
return true;
}