सामग्री पर जाएँ
Topos Uranos

सारांश

इनपुट वह सीमा है जिससे होकर दुनिया किसी प्रोग्राम में प्रवेश करती है, और दुनिया विनिर्देशों का सम्मान नहीं करती। यह पाठ भरोसा किए बिना पढ़ना सिखाता है: std::getline से पूरी पंक्तियाँ पढ़ना और उसे >> के साथ मिलाने पर प्रकट होने वाली खाली पंक्ति से बचना; स्ट्रीम की अवस्था पूछना और उसकी मदद से उन तीन स्थितियों में भेद करना जिन्हें पाठ इनपुट, आउटपुट और त्रुटियाँ ने केवल आपस में उलझी हुई देखा था (अमान्य डेटा, वह संख्या जो नहीं समाती, और डेटा का अंत); clear और ignore से विफल पठन के बाद उबरना; और, सबसे सुरक्षित तरीके के रूप में, हर डेटा को टेक्स्ट की तरह पढ़ना और उसे std::from_chars से रूपांतरित करना, उसे तभी स्वीकार करते हुए जब रूपांतरण ने पूरा टेक्स्ट खपा लिया हो। पाठ एक फ़ंक्शन readInt के साथ, उसके अनुबंध सहित, समाप्त होता है, जिसे पाठ्यक्रम का शेष भाग दोबारा इस्तेमाल कर सकता है।

अधिगम उद्देश्य

  1. std::getline से पूरी पंक्तियाँ पढ़ना, यह समझाना कि >> वाले पठन के बाद आने वाला getline खाली पंक्ति क्यों लौटाता है, और std::ws से इससे बचना।
  2. पठन के बाद fail() और eof() से स्ट्रीम की अवस्था पूछना, और उसकी मदद से अमान्य डेटा, अपने प्रकार में न समाने वाली संख्या और इनपुट के अंत में भेद करना।
  3. ऐसा पठन लूप लिखना जो अमान्य इनपुट के बाद clear और ignore से उबर जाए, और इनपुट समाप्त होने पर रुक जाए।
  4. टेक्स्ट की तरह पढ़ी गई संख्या का std::from_chars से सत्यापन करना, यह माँगते हुए कि कोई त्रुटि न हो और पूरी स्ट्रिंग खप जाए, और सत्यापन को अनुबंध वाले फ़ंक्शनों में समेटना।

सीमा, एक बार फिर

पाठ इनपुट, आउटपुट और त्रुटियाँ ने std::cin >> n के बारे में तीन तथ्य स्थापित किए: पठन उस पहले वर्ण पर, उसे खपाए बिना, रुक जाता है जो संख्या को आगे नहीं बढ़ा सकता; यदि वह एक भी वर्ण नहीं पढ़ पाता, तो स्ट्रीम त्रुटि अवस्था में चली जाती है और उसके बाद का हर पठन कुछ नहीं करता; और if (std::cin) से पता चलता है कि कुछ विफल हुआ या नहीं। पाठ लूप ने यह जोड़ा कि शर्त while (std::cin >> value) इनपुट समाप्त होने पर भी रुकती है और अमान्य डेटा आने पर भी। फिर भी, इन साधनों से प्रोग्राम यह तो पकड़ लेता है कि कुछ गड़बड़ हुई, पर यह नहीं जानता कि क्या, और हार मानने के सिवा कुछ नहीं कर सकता।

यह पाठ डिज़ाइन के एक सिद्धांत से आरंभ करता है, सीमा पर रक्षात्मक प्रोग्रामिंग के सिद्धांत से: भीतर आने वाले हर डेटा का उपयोग से पहले सत्यापन होता है, और उसका सत्यापन करने वाला प्रोग्राम उस अमान्य डेटा को, जो सुधार की गुंजाइश देता है (उसे फिर से माँगना, छोड़ देना, उसकी सूचना देना), डेटा के अंत से अलग करता है, जो यह गुंजाइश नहीं देता। यदि ऐसा है, तो तीन चीज़ें चाहिए: डेटा को वैसा ही पढ़ना जैसा वह लिखा गया, यानी एक पंक्ति; यह जानना कि कोई पठन क्यों विफल हुआ; और स्ट्रीम को पढ़ने की क्षमता लौटाना।