दिलचस्प पोस्ट
MySQL त्रुटि: तालिका को संग्रहीत फ़ंक्शन / ट्रिगर में अपडेट नहीं किया जा सकता क्योंकि यह पहले से ही कथन द्वारा उपयोग किया जाता है जो इस संग्रहीत फ़ंक्शन / ट्रिगर को लागू करता है उपयोगकर्ताओं को अपनी साइट पर जावास्क्रिप्ट जोड़ने की इजाजत देने के लिए सुरक्षा मुद्दे? मैवेन: मैं कमांड लाइन विकल्पों के माध्यम से कुछ परियोजनाओं में परीक्षण कैसे छोड़ सकता हूं? ग्रहण / एंड्रॉइड: "डेवलपर रनिंग डेवलपर 'एंड्रॉइड प्री कम्पाइलर' परियोजना पर …" जावा बिटस्सेट उदाहरण क्या मैं जावा 7 का उपयोग करके संसाधनों के साथ सही तरीके से उपयोग कर रहा हूं? दूसरे वेबसाइट पर रेल में नियंत्रक से डाक डेटा जमा करना त्रुटि कोड: 2013. क्वेरी के दौरान MySQL सर्वर से कनेक्शन खो गया PHP मेल किसी कारण से काम नहीं कर रहा है अजगर: एक प्रोजेक कथन में प्रिंट आउटपुट प्राप्त करें पर्ल उपनगरीय तर्क आप एम्बेडेड यूट्यूब प्लेयर कैसे म्यूट करते हैं? एसएमटीपी सर्वर प्रतिक्रिया: 530 5.7.0 सबसे पहले एक STARTTLS आदेश जारी करना चाहिए Google Play या Side-Load से एक एप्लिकेशन को कैसे स्थापित किया गया है? जावा, लगातार बदलते ग्राफिक्स कैसे आकर्षित करें

एक INI फ़ाइल की रेखा संख्या प्राप्त करने के लिए क्रॉस-प्लेटफ़ॉर्म का तरीका जहां दिया गया विकल्प मिला

कुछ सी ++ लाइब्रेरी (जैसे बढ़ावा :: प्रोग्राम_पॉइंट्स) की तलाश है जो INI फ़ाइल की लाइन संख्या को वापस करने में सक्षम है, जहां दिए गए विकल्प या अनुभाग मिला।

बक्सों का इस्तेमाल करें:

  1. मैं एक खंड "[एसएसएस]" में मूल्य "वीवीवी" खोजने के लिए पुस्तकालय से पूछता हूं। लाइब्रेरी लाइन नंबर देता है जहां अनुभाग "[एसएसएस]" में "वीवीवी" पाया जाता है, या -1 यह मुझे "पंक्ति 55: vvv <256" होना चाहिए कहने की क्षमता देता है

  2. मैं अनुभागों के लिए INI फ़ाइल पुनरावृति करता हूं और उनके नामों को मान्य करता हूं। जब कुछ जंगली धाराएं मिल जाती हैं, तो मैं कहता हूं: "पंक्ति 55: अनुभाग [हाहा] अज्ञात है"

अपडेट करें: मुझे पता है कि "आईएनआई विशाल से पुराना है", लेकिन फिलहाल मुझे क्रॉस-प्लेटफॉर्म के लिए बड़ी खिड़कियों वाली बंदरगाह को बंद करना है और जल्द ही .ini फ़ाइलों से छुटकारा नहीं मिल सकता है।

Solutions Collecting From Web of "एक INI फ़ाइल की रेखा संख्या प्राप्त करने के लिए क्रॉस-प्लेटफ़ॉर्म का तरीका जहां दिया गया विकल्प मिला"

एक बार फिर, बूस्ट आत्मा के साथ खेलने का मौका मिला। इस बार मुझे line_pos_iterator साथ खेलना line_pos_iterator

यहां मेरे श्रम का फल है: https://gist.github.com/1425972

  • POSITIONINFO == 0
    • इनपुट स्ट्रीमिंग है
    • आउटपुट कच्चे स्ट्रिंग हैं (अच्छी तरह से, map<string, map<string, string> > वर्गों के लिए)
  • POSITIONINFO == 1

    • इनपुट बफर है
    • आउटपुट textnode_t :

       struct textnode_t { int sline, eline, scol, ecol; string_t text; }; 

      इसका मतलब यह है कि परिणामस्वरूप map<textnode_t, map<textnode_t, textnode_t> > व्यक्तिगत पाठ नोड्स को ठीक से (लाइन, कॉल) प्रारंभ और समाप्ति अंक की रिपोर्ट करने में सक्षम है। डेमो के लिए परीक्षण आउटपुट देखें

    • टिप्पणियां ( # , /* ... */ शैली) कार्यान्वित की गई हैं

    • व्हाइटस्पेस 'सहन' है

      नाम = मान # पीछे की ओर सफेद स्थान के विकल्प को शामिल करने के लिए एक टिप्पणी का उपयोग करें = escape \ slash के साथ \

    • slashes डि-एस्केपिंग एक व्यायाम के रूप में छोड़ दिया जाता है

    • सक्षम होने पर त्रुटियां पूरी स्थिति की जानकारी के साथ भी रिपोर्ट की जाती हैं

नोट सी + + 11 समर्थन की आवश्यकता नहीं है, लेकिन मैं इसे पार्स के परिणाम को डंप करने के लिए इस्तेमाल किया है। मैं इसे सी ++ 03 वर्बोस इटरेटर स्टाइल के साथ लिखने के लिए बहुत आलसी हूं। 🙂

सभी कोड, मेसेफाइल, उदाहरण .इनी यहां पाया जा सकता है: https://gist.github.com/1425972

कोड

 /* inireader.h */ #pragma once #define POSITIONINFO 0 #include <map> #include <string> #include <iterator> #include <boost/tuple/tuple_comparison.hpp> template <typename S=std::string, typename Cmp=std::less<S> > class IniFile { public: IniFile(Cmp cmp=Cmp()) : _cmp(cmp) {} IniFile(const std::string& filename, Cmp cmp=Cmp()) : _cmp(cmp) { open(filename); } void open(const std::string& filename); typedef S string_t; #if POSITIONINFO struct textnode_t { int sline, eline, scol, ecol; string_t text; operator const string_t&() const { return text; } friend std::ostream& operator<<(std::ostream& os, const textnode_t& t) { os << "[L:" << t.sline << ",C" << t.scol << " .. L" << t.eline << ",C" << t.ecol << ":"; for (typename string_t::const_iterator it=t.text.begin(); it!=t.text.end(); ++it) switch (*it) { case '\r' : os << "\\r"; break; case '\n' : os << "\\n"; break; case '\t' : os << "\\t"; break; case '\0' : os << "\\0"; break; default: os << *it ; break; } return os << "]"; } bool operator<(const textnode_t& o) const { return boost::tie(text/*, sline, eline, scol, ecol*/) < boost::tie(o.text/*, o.sline, o.eline, o.scol, o.ecol*/); } textnode_t() : sline(0), eline(0), scol(0), ecol(0) { } }; #else typedef string_t textnode_t; #endif typedef std::pair<textnode_t, textnode_t> keyvalue_t; typedef std::map<textnode_t, textnode_t> section_t; typedef std::map<textnode_t, section_t> sections_t; private: Cmp _cmp; }; /////////////////////////////////////// // template implementation //#define BOOST_SPIRIT_DEBUG #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/support_istream_iterator.hpp> #include <boost/spirit/include/support_line_pos_iterator.hpp> #include <boost/spirit/include/phoenix.hpp> #include <boost/fusion/adapted/std_pair.hpp> #include <fstream> namespace qi = boost::spirit::qi; namespace phx= boost::phoenix; namespace inireader { struct printer { printer(std::ostream& os) : _os(os) {} std::ostream& _os; typedef boost::spirit::utf8_string string; void element(string const& tag, string const& value, int depth) const { for (int i = 0; i < (depth*4); ++i) // indent to depth _os << ' '; _os << "tag: " << tag; if (value != "") _os << ", value: " << value; _os << std::endl; } }; void print_info(std::ostream& os, boost::spirit::info const& what) { using boost::spirit::basic_info_walker; printer pr(os); basic_info_walker<printer> walker(pr, what.tag, 0); boost::apply_visitor(walker, what.value); } template <typename It, typename Skipper, typename Ini> struct Grammar : qi::grammar<It, typename Ini::sections_t(), Skipper> { typedef typename Ini::string_t string_t; typedef typename Ini::textnode_t textnode_t; struct textbuilder { template <typename> struct result { typedef textnode_t type; }; textbuilder(It begin) : _begin(begin) { } textnode_t operator()(const boost::iterator_range<It>& iters) const { #if !POSITIONINFO return textnode_t(std::begin(iters), std::end(iters)); #else using boost::spirit::get_line; using boost::spirit::get_line_start; using boost::spirit::get_column; textnode_t element; element.text = string_t (std::begin(iters) , std::end(iters)); element.sline = get_line (std::begin(iters)); element.eline = get_line (std::end(iters)); It sol = get_line_start (_begin , std::begin(iters)); element.scol = get_column (sol , std::begin(iters)); element.ecol = get_column (sol , std::end(iters)); return element; #endif } private: const It _begin; } makenode; Grammar(It begin) : Grammar::base_type(inifile), makenode(begin) { using namespace qi; txt_ch = (lit('\\') > char_) | (char_ - (eol | '#' | "/*")); key = raw [ lexeme [ +(txt_ch - char_("=")) ] ] [ _val = phx::bind(makenode, _1) ]; value = raw [ lexeme [ +txt_ch ] ] [ _val = phx::bind(makenode, _1) ]; pair %= key > '=' > value; heading = ('[' > raw [ +~char_(']') ] > ']') [ _val = phx::bind(makenode, _1) ]; section %= heading >> +eol >> -((pair-heading) % +eol); inifile %= -(section % +eol) >> *eol > eoi; comment = ('#' >> *(char_ - eol)) | ("/*" > *(char_ - "*/") > "*/"); //BOOST_SPIRIT_DEBUG_NODE(comment); //BOOST_SPIRIT_DEBUG_NODE(txt_ch); BOOST_SPIRIT_DEBUG_NODE(heading); BOOST_SPIRIT_DEBUG_NODE(section); BOOST_SPIRIT_DEBUG_NODE(key); BOOST_SPIRIT_DEBUG_NODE(value); BOOST_SPIRIT_DEBUG_NODE(pair); BOOST_SPIRIT_DEBUG_NODE(inifile); } typedef typename Ini::keyvalue_t keyvalue_t; typedef typename Ini::section_t section_t; typedef typename Ini::sections_t sections_t; typedef typename string_t::value_type Char; qi::rule<It> comment; qi::rule<It, Char()> txt_ch; qi::rule<It, textnode_t(), Skipper> key, value, heading; qi::rule<It, keyvalue_t(), Skipper> pair; qi::rule<It, std::pair<textnode_t, section_t>(), Skipper> section; qi::rule<It, sections_t(), Skipper> inifile; }; template <typename It, typename Builder> typename Builder::template result<void>::type fragment(const It& first, const It& last, const Builder& builder) { size_t len = std::distance(first, last); It frag_end = first; std::advance(frag_end, std::min(10ul, len)); return builder(boost::iterator_range<It>(first, frag_end)); } } template <typename S, typename Cmp> void IniFile<S, Cmp>::open(const std::string& filename) { using namespace qi; std::ifstream ifs(filename.c_str()); ifs.unsetf(std::ios::skipws); #if POSITIONINFO typedef std::string::const_iterator RawIt; typedef boost::spirit::line_pos_iterator<RawIt> It; typedef rule<It> Skipper; std::string buffer(std::istreambuf_iterator<char>(ifs), (std::istreambuf_iterator<char>())); It f(buffer.begin()), l(buffer.end()); #else typedef boost::spirit::istream_iterator It; typedef rule<It> Skipper; It f(ifs), l; #endif inireader::Grammar<It, Skipper, IniFile<S, Cmp> > grammar(f); Skipper skip = char_(" \t") | grammar.comment; try { sections_t data; bool ok = phrase_parse(f, l, grammar, skip, data); if (ok) { std::cout << "Parse success!" << std::endl; ///////// C++11 specific features for quick display ////////// for (auto& section : data) { std::cout << "[" << section.first << "]" << std::endl; for (auto& pair : section.second) std::cout << pair.first << " = " << pair.second << std::endl; ///////// End C++11 specific ///////////////////////////////// } } else { std::cerr << "Parse failed" << std::endl; } } catch (const qi::expectation_failure<It>& e) { std::cerr << "Exception: " << e.what() << " " << inireader::fragment(e.first, e.last, grammar.makenode) << "... "; inireader::print_info(std::cerr, e.what_); } if (f!=l) { std::cerr << "Stopped at: '" << inireader::fragment(f, l, grammar.makenode) << "'" << std::endl; } } 

डेमो इनपुट

 [Cat1] name1=100 #skipped name2=200 \#not \\skipped name3= dhfj dhjgfd/* skipped */ [Cat_2] UsagePage=9 Usage=19 Offset=0x1204 /* [Cat_2_bak] UsagePage=9 Usage=19 Offset=0x1204 */ [Cat_3] UsagePage=12 Usage=39 #Usage4=39 Offset=0x12304 

डेमो आउटपुट (POSITIONINFO == 0)

 Parse success! [Cat1] name1 = 100 name2 = 200 \#not \\skipped name3 = dhfj dhjgfd [Cat_2] Offset = 0x1204 Usage = 19 UsagePage = 9 [Cat_3] Offset = 0x12304 Usage = 39 UsagePage = 12 

डेमो आउटपुट (POSITIONINFO == 1)

 Parse success! [[L:1,C2 .. L1,C6:Cat1]] [L:2,C2 .. L2,C7:name1] = [L:2,C8 .. L2,C12:100 ] [L:6,C2 .. L6,C7:name2] = [L:6,C8 .. L6,C27:200 \#not \\skipped] [L:7,C2 .. L7,C7:name3] = [L:7,C11 .. L7,C22:dhfj dhjgfd] [[L:13,C3 .. L13,C8:Cat_2]] [L:16,C2 .. L16,C8:Offset] = [L:16,C9 .. L16,C15:0x1204] [L:15,C2 .. L15,C7:Usage] = [L:15,C8 .. L15,C10:19] [L:14,C2 .. L14,C11:UsagePage] = [L:14,C12 .. L14,C13:9] [[L:25,C3 .. L25,C8:Cat_3]] [L:29,C2 .. L29,C8:Offset] = [L:29,C9 .. L29,C16:0x12304] [L:27,C2 .. L27,C7:Usage] = [L:27,C8 .. L27,C10:39] [L:26,C2 .. L26,C11:UsagePage] = [L:26,C12 .. L26,C14:12]