2015-01-27 3 views
2

을 사용하여 .yaml 파일에 노드를 쓰거나 편집하는 함수를 작성하려고합니다. 내 코드가 로컬 복사본을 편집 할 때 일종의 일을하고있다. _baseNode을 인쇄하면 노드의 값이 5.4 인 것으로 나타납니다. 그러나 함수를 종료하고 내 컴퓨터에서 내 .yaml을 확인한 후에 값 5.4가 없습니다. 여기 C++ YAML : .yaml 파일의 노드를 편집/작성하는 방법

내 시도 ( _baseNode 개인 내 클래스의 멤버) :

YAML::Node& baseNode = YAML::LoadFile(_parameterFileName); 

하지만이 오류를 얻을 : 내 두 번째 시도를 들어

void ParametersServerPC::testFunc2() { 

    boost::filesystem::path path(boost::filesystem::initial_path()/_parameterFileName); 
    _baseNode = YAML::LoadFile(_parameterFileName); 

    _baseNode["chip"]["clock_rate"]["3"] = 5.4; 

    std::cout << _baseNode << std::endl; 

} 

, 나는 YAML::Node& baseNode을 만들어 :

invalid initialization of non-const reference of type 'YAML::Node&' from an rvalue of type 'YAML::Node' 

관심있는 사람들을 위해,294,파일은 다음과 같습니다 :

chip: 
    clock_rate: 
    0: 1.0 
    1: 1.0 
    2: 1.0 
    3: 3.0 
    4: 1.0 

내가 5.4 3.0에서 3에 의해 매핑 된 값을 변경하고 싶습니다.

+0

? 데이터가 메모리에로드되고 파일 시스템에 마법 같은 인터페이스를 제공하지 않는다는 것은 꽤 분명합니다. 'Emitter' API를 사용하여 변경된 트리를 파일 시스템에 명시 적으로 써야합니다. http://stackoverflow.com/questions/3342355/save-a-yaml-emitter-content-to-a-file-with- yaml-cpp. – filmor

+0

오, 그래. 나는 튜토리얼 (https://code.google.com/p/yaml-cpp/wiki/Tutorial#Building_Nodes)을 기반으로 파일에 노드를 만들 수 있다고 생각했다. 나는이'Emitter' API를 살펴볼 것입니다. –

답변

4

의견에서 @filmor가 말한 것과 마찬가지로 LoadFile은 데이터를 메모리에로드하기 만하며 파일 시스템에 대한 인터페이스를 제공하지 않습니다.

따라서, .yaml 파일을 편집하려면 먼저 파일의 루트 노드를 편집하고 그래서 같은 파일로 다시 덤프해야합니다 예상 할`LoadFile`가해야 할 일

YAML::Node node, _baseNode = YAML::LoadFile("file.yaml"); // gets the root node 
_baseNode["change"]["this"]["node"] = "newvalue"; // edit one of the nodes 
std::ofstream fout("fileUpdate.yaml"); 
fout << _baseNode; // dump it back into the file