मैं एक आवेदन के लिए कस्टम विकल्प फ़ाइल के लिए एक सी ++ पार्सर लिख रहा हूं। मेरे पास एक लूप है जो 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_str
useful_statement
के सटीक भाग में इंगित करता है जिसमें वह मान शामिल है जिसे मैं निकालना चाहता हूं, लेकिन std::string_view
से double
पढ़ने का तरीका पता नहीं लगा सकता।
मुझे std::stod
पता है जो std::string_view
के साथ काम नहीं करता है। यह मेरे
double value = std::stod(std::string(value_str));
लिखने के लिए हालांकि, इस बदसूरत है क्योंकि यह एक स्ट्रिंग जो वास्तव में जरूरत नहीं है करने के लिए धर्मान्तरित है, और फिर भी यह शायद मेरे मामले में एक उल्लेखनीय अंतर नहीं होगा, यह भी यदि धीमी गति से हो सकता है की अनुमति देता है किसी को टेक्स्ट फ़ाइल से बड़ी मात्रा में संख्याएं पढ़नी पड़ती थीं।
दूसरी ओर, atof
काम नहीं करेगा क्योंकि मैं एक शून्य टर्मिनेटर की गारंटी नहीं दे सकता। मैं इसे बनाने के दौरान \0
useful_statement
जोड़कर इसे हैक कर सकता हूं, लेकिन इससे कोड को पाठक को भ्रमित कर दिया जाएगा और कोड को बदला/दोबारा बदलने के लिए इसे तोड़ना बहुत आसान हो जाएगा।
तो, ऐसा करने के लिए एक स्वच्छ, सहज और उचित रूप से प्रभावी तरीका क्या होगा?
क्या आप बूस्ट का उपयोग करने के साथ ठीक हैं? मुझे लगता है कि आप इसे 'बूस्ट :: कन्वर्ट (स्ट्रिंगव्यू) के साथ कर सकते हैं; '। मैंने इसे यहां से बंद कर दिया ... पृष्ठ पर अंतिम टिप्पणी https://github.com/boostorg/convert/issues/29 –
अच्छी खोज। यह शायद 'बूस्ट :: कन्वर्ट करें (स्ट्रिंगव्यू, स्ट्रिंगव्यू। लम्बाई()), हालांकि। यह निश्चित रूप से एक स्ट्रिंग और उम्मीद से तेज़ी से परिवर्तित करने से साफ है। केवल नकारात्मक पक्ष को बढ़ावा देने के लिए एक अतिरिक्त निर्भरता है। –
patatahooligan
विषय से बाहर: जाहिर है यह psuedocode है, लेकिन आप "कैसे (ईओएफ नहीं)" पर ध्यान केंद्रित करते हैं। मामूली 'जबकि (! Stream.eof()) 'में कुछ गड़बड़ है। – user4581301