को पार्स करने के लिए 'sscanf` के बजाय स्ट्रिंगस्ट्रीम का उपयोग करके द्वारा sscanf
पर एक प्रकार-सुरक्षित विकल्प के रूप में एक निश्चित प्रारूप string
से मूल्य निकालने के लिए प्रदान की गई सुविधाओं का उपयोग करना चाहूंगा। मैं यह कैसे कर सकता हूँ?फिक्स्ड-फॉर्मेट स्ट्रिंग
निम्नलिखित विशिष्ट उपयोग केस पर विचार करें। मैं निम्नलिखित निश्चित प्रारूप में एक std::string
है:
YYYYMMDDHHMMSSmmm
कहाँ:
YYYY = 4 digits representing the year
MM = 2 digits representing the month ('0' padded to 2 characters)
DD = 2 digits representing the day ('0' padded to 2 characters)
HH = 2 digits representing the hour ('0' padded to 2 characters)
MM = 2 digits representing the minute ('0' padded to 2 characters)
SS = 2 digits representing the second ('0' padded to 2 characters)
mmm = 3 digits representing the milliseconds ('0' padded to 3 characters)
पहले मैं इन पंक्तियों के साथ कुछ कर रहा था:
string s = "20101220110651184";
unsigned year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0, milli = 0;
sscanf(s.c_str(), "%4u%2u%2u%2u%2u%2u%3u", &year, &month, &day, &hour, &minute, &second, &milli);
चौड़ाई मूल्यों जादू नंबर दिए गए हैं , और यह ठीक है। मैं इन मानों को निकालने के लिए धाराओं का उपयोग करना चाहता हूं और टाइप सुरक्षा के हित में उन्हें unsigned
में परिवर्तित करना चाहता हूं। लेकिन जब मैं कोशिश यह:
stringstream ss;
ss << "20101220110651184";
ss >> setw(4) >> year;
year
मूल्य 0
बरकरार रखती है। यह 2010
होना चाहिए।
मैं जो कर रहा हूं वह मैं कैसे कर सकता हूं? मैं बूस्ट या किसी अन्य तृतीय पक्ष लाइब्रेरी का उपयोग नहीं कर सकता, न ही मैं सी ++ 0x का उपयोग कर सकता हूं।
* विधेयक "मानक सी ++ IOstreams और स्थानों" अपने प्रति के लिए इंतजार नहीं कर सकता ... +1 –
'setw() 'लेखन के लिए है। यह पढ़ने के लिए काम नहीं करता है। – marcog
शायद आपको पहले फ़ील्ड को निकालने से पहले स्ट्रीम की शुरुआत में वापस जाना चाहिए। –