如何使用POCO库将更改写入“.ini”文件?

时间:2012-10-15 09:48:48

标签: c++ ini poco-libraries

我正在尝试使用Poco :: Util :: IniFileConfiguration对“.ini”文件进行更改。我有以下示例 ini 文件:

[Test]
IP = 192.168.1.1

我希望能够在文件中写入新的IP。到目前为止我所拥有的是:

#include "Poco/Util/IniFileConfiguration.h"
#include <iostream>

int main( int argc, char *argv[] ) {
  Poco::AutoPtr<Poco::Util::IniFileConfiguration> pConf( new Poco::Util::IniFileConfiguration( "file.ini" ) );
  if ( pConf->has( "Test.IP" ) ) {
    try {
      std::cout << pConf->getString( "Test.IP" ) << std::endl;
      pConf->setString( "Test.IP", "127.0.0.1" );
      std::cout << pConf->getString( "Test.IP" ) << std::endl;
      // TODO Make changes permanent; write to file!
    } catch ( Poco::SyntaxException& e ) {
      std::cerr << "writeValue: " << e.displayText() << std::endl;
      return -1;
    }
  }
  return 0;
}

此代码打印以下内容:

192.168.1.1
127.0.0.1

IP在运行时更改,但不会将更改写入磁盘(file.ini未更改)。有没有一种简单的方法来实现这一目标?

谢谢!

2 个答案:

答案 0 :(得分:1)

这很奇怪,但目前Poco IniConfigurationFile是readonly,无法保存。 Proof on this presentation

因此,如果你想使用ini文件,你需要编写自己的实现来保存PocoIniConfiguration或使用另一个库。

答案 1 :(得分:0)

class CIniConfig : public Poco::Util::IniFileConfiguration
{
//  using namespace Poco::Util;
public :
    CIniConfig();
    using Poco::Util::IniFileConfiguration::IniFileConfiguration;

bool SaveConfig()
{
std::string key ;
    Keys range ;
    //If an empty key is passed, all root level keys are returned.
    enumerate(key,range);
    if(range.empty())
        return false ;
    using namespace std ;
    std::wofstream out;
    out.open(L"config.ini",std::ios_base::out|std::ios_base::trunc);
    if(!out.is_open())
        return false;
    for(auto item : range)
    {

        string pair = item ;
        pair.append("=");
        pair.append(getString(item));
        std::wstring result(pair.begin(),pair.end());
        out << result << endl;
    }
    out.flush();
    out.close();
    return true;
}
}