2017-08-11 18 views
8

मैं एक आवेदन के लिए कस्टम विकल्प फ़ाइल के लिए एक सी ++ पार्सर लिख रहा हूं। मेरे पास एक लूप है जो option=value के रूप में एक टेक्स्ट फ़ाइल से लाइनें पढ़ता है जहां value को double में परिवर्तित किया जाना चाहिए। स्यूडोकोड में यह निम्नलिखित है:std :: string_view को दो बार कैसे परिवर्तित करें?

while(not EOF) 
    statement <- read_from_file 
    useful_statement <- remove whitespaces, comments, etc from statement 
    equal_position <- find '=' in useful_statement 
    option_str <- useful_statement[0:equal_position) 
    value_str <- useful_statement[equal_position:end) 
    find_option(option_str) <- double(value_str) 

स्ट्रिंग बंटवारे को संभालने के लिए और कार्यों के लिए चारों ओर से गुजर रहा है, मैं std::string_view उपयोग करें, क्योंकि यह अत्यधिक नकल से बचा जाता है और स्पष्ट रूप से एक पूर्व मौजूदा std::string के क्षेत्रों को देखने के इरादे से कहा गया है। मैंने उस बिंदु पर सब कुछ किया है जहां std::string_view value_struseful_statement के सटीक भाग में इंगित करता है जिसमें वह मान शामिल है जिसे मैं निकालना चाहता हूं, लेकिन std::string_view से double पढ़ने का तरीका पता नहीं लगा सकता।

मुझे std::stod पता है जो std::string_view के साथ काम नहीं करता है। यह मेरे

double value = std::stod(std::string(value_str)); 

लिखने के लिए हालांकि, इस बदसूरत है क्योंकि यह एक स्ट्रिंग जो वास्तव में जरूरत नहीं है करने के लिए धर्मान्तरित है, और फिर भी यह शायद मेरे मामले में एक उल्लेखनीय अंतर नहीं होगा, यह भी यदि धीमी गति से हो सकता है की अनुमति देता है किसी को टेक्स्ट फ़ाइल से बड़ी मात्रा में संख्याएं पढ़नी पड़ती थीं।

दूसरी ओर, atof काम नहीं करेगा क्योंकि मैं एक शून्य टर्मिनेटर की गारंटी नहीं दे सकता। मैं इसे बनाने के दौरान \0useful_statement जोड़कर इसे हैक कर सकता हूं, लेकिन इससे कोड को पाठक को भ्रमित कर दिया जाएगा और कोड को बदला/दोबारा बदलने के लिए इसे तोड़ना बहुत आसान हो जाएगा।

तो, ऐसा करने के लिए एक स्वच्छ, सहज और उचित रूप से प्रभावी तरीका क्या होगा?

+1

क्या आप बूस्ट का उपयोग करने के साथ ठीक हैं? मुझे लगता है कि आप इसे 'बूस्ट :: कन्वर्ट (स्ट्रिंगव्यू) के साथ कर सकते हैं; '। मैंने इसे यहां से बंद कर दिया ... पृष्ठ पर अंतिम टिप्पणी https://github.com/boostorg/convert/issues/29 –

+1

अच्छी खोज। यह शायद 'बूस्ट :: कन्वर्ट करें (स्ट्रिंगव्यू, स्ट्रिंगव्यू। लम्बाई()), हालांकि। यह निश्चित रूप से एक स्ट्रिंग और उम्मीद से तेज़ी से परिवर्तित करने से साफ है। केवल नकारात्मक पक्ष को बढ़ावा देने के लिए एक अतिरिक्त निर्भरता है। – patatahooligan

+0

विषय से बाहर: जाहिर है यह psuedocode है, लेकिन आप "कैसे (ईओएफ नहीं)" पर ध्यान केंद्रित करते हैं। मामूली 'जबकि (! Stream.eof()) 'में कुछ गड़बड़ है। – user4581301

उत्तर

10

चूंकि आपने सी ++ 1z के साथ अपना प्रश्न चिह्नित किया है, तो उस (सैद्धांतिक रूप से) का अर्थ है कि आपके पास from_chars तक पहुंच है। यह const char* रों की एक जोड़ी से ज्यादा कुछ भी जरूरत के बिना अपने स्ट्रिंग करने वाली संख्या रूपांतरण संभाल कर सकते हैं:

double dbl; 
auto result = from_chars(&value_str[0], &value_str[0] + value_str.size(), dbl); 
बेशक

, यह जरूरी है कि अपने मानक पुस्तकालय from_chars के एक कार्यान्वयन प्रदान करते हैं। Libstdc++ does not, न ही does libc++। या उस मामले के लिए विजुअल स्टूडियो।

+0

'from_chars()' 'डबल *' डबल और 'नहीं लेता है। यह भी एक अजीब इंटरफेस है ... दिया गया है कि कोई भी इसे प्रदान नहीं करता है, शायद यह एक 'string_view' लेने का एक अच्छा अवसर है ... – Barry

+1

यह वही होगा जो मैं इसे लागू करने के लिए देख रहा हूं। मैं पठनीयता के लिए'from_chars (& value_str.front(), और value_str.back(), dbl) को कॉल बदलने की अनुशंसा करता हूं, बीटीडब्ल्यू। @ बैरी: इसे 'स्ट्रिंग_व्यू' लेने के लिए बहुत अधिक कारण नहीं है 'char *' के साथ काम करना इसे सार्वभौमिक बनाता है और 'string_view' से प्राप्त करने के लिए यह छोटा है। – patatahooligan

+0

@ बैरी: यदि 'basic_string_view' गारंटी है कि इसके इटरेटर * पॉइंटर्स * थे तो यह कम अजीब होता। –

संबंधित मुद्दे