[C++] 如何使用Boost解析ini文件



Answers

由於結構簡單,解析INI文件很容易。 使用AX我可以寫幾行來解析部分,屬性和註釋:

auto trailing_spaces = *space & endl;
auto section = '[' & r_alnumstr() & ']';
auto name = +(r_any() - '=' - endl - space);
auto value = '"' & *("\\\"" | r_any() - '"') & '"'
   | *(r_any() - trailing_spaces);
auto property = *space & name & *space & '=' & *space 
    & value & trailing_spaces;
auto comment = ';' & *(r_any() - endl) & endl;
auto ini_file = *comment & *(section & *(prop_line | comment)) & r_end();

更詳細的示例可以在Reference.pdf找到

關於不讀取整個文件,可以用不同的方式完成。 首先,INI格式的解析器至少需要前向迭代器,所以你不能使用流迭代器,因為它們是輸入迭代器。 您可以使用所需的迭代器為流創建一個單獨的類(我在過去使用滑動緩衝區編寫了一個這樣的類)。 您可以使用內存映射文件。 或者,您可以使用動態緩衝區,從標準流中讀取並提供給解析器,直到找到值。 如果您不想擁有真正的解析器,並且不關心INI文件結構是否正確,則只需在文件中搜索令牌即可。 輸入迭代器就足夠了。

最後,我不確定避免閱讀整個文件會帶來任何好處。 INI文件通常很小,因為硬盤驅動器和多個緩衝系統無論如何都會讀取一個或多個扇區(即使你只需要一個字節),所以我懷疑通過嘗試部分讀取文件會有任何性能提升(特別是反复這樣做),可能恰恰相反。

Question

我有一個ini文件,其中包含一些示例值,如:

[Section1]
Value1 = 10
Value2 = a_text_string

我正在嘗試加載這些值並使用Boost在我的應用程序中打印它們,但我不明白如何在C ++中執行此操作。

我在這個論壇中搜索以找到一些例子(我總是使用C,所以我在C ++中不是很好),但我只找到了關於如何一次性從文件中讀取值的示例。

我需要在我想要的時候只加載一個值,比如string = Section1.Value2因為我不需要讀取所有值,只讀取其中的一些。

我想加載單個值並將它們存儲在變量中,以便在我的應用程序中使用它們時使用它們。

使用Boost可以做到這一點嗎?

目前,我正在使用此代碼:

#include <iostream>
#include <string>
#include <set>
#include <sstream>
#include <exception>
#include <fstream>
#include <boost/config.hpp>
#include <boost/program_options/detail/config_file.hpp>
#include <boost/program_options/parsers.hpp>

namespace pod = boost::program_options::detail;

int main()
{
   std::ifstream s("file.ini");
    if(!s)
    {
        std::cerr<<"error"<<std::endl;
        return 1;
    }

    std::set<std::string> options;
    options.insert("Test.a");
    options.insert("Test.b");
    options.insert("Test.c");

    for (boost::program_options::detail::config_file_iterator i(s, options), e ; i != e; ++i)
        std::cout << i->value[0] << std::endl;
   }

但這只是讀取for循環中的所有值; 相反,我只想在需要時讀取單個值,並且我不需要在文件中插入值,因為它已經用我在程序中需要的所有值寫入。




需要解析文件,必須按順序完成。 所以我只是讀取整個文件,將所有值存儲在某個集合中( mapunordered_map ,可能使用pair<section, key>作為鍵或使用map映射)並在需要時從那裡獲取它們。




Links