दिलचस्प पोस्ट
प्रेत किट में टकराव का पता लगा रहा है Django में AJAX के माध्यम से पोस्ट पैरामीटर, जबकि "CSRF टोकन अनुपलब्ध या गलत" एक सामाजिक गतिविधि स्ट्रीम को लागू करने का सबसे अच्छा तरीका क्या है? एक सेट में लगातार तिथियों की जांच करें और श्रेणी के रूप में लौटें कार्य है। कारखाना। स्टार्टन्यू () ने कॉलिंग थ्रेड से दूसरे थ्रेड का उपयोग करने की गारंटी दी है? जैक्सन का उपयोग करते हुए JSON वस्तुओं पर नए फ़ील्ड्स को अनदेखा करना वनिलाजेएस क्या है? सी ++ में सरणियों या std :: vectors का उपयोग करना, प्रदर्शन अंतर क्या है? ListView में फोकसबल संपादन टेक्स्ट कैसे DOMDocument के बाहरी HTML वापस करने के लिए? बाह्य डेटा पर आधारित गतिशील रूटिंग निश्चित मूल्यों के साथ JPA में नक्शा enum? GLES10.glGetIntegerv केवल लॉलीपॉप में 0 देता है अंकित मान्यता पुस्तकालय आरएम, सीपी, एमवी कमांड्स के लिए तर्क सूची बहुत लंबी त्रुटि है

मूल_ओआईएस पर झंडे की शब्दावली

मैं खुद को rdstate() झंडे द्वारा बार-बार चकित कर rdstate()good() , bad() , eof() , fail() – और कैसे वे basic_ios::operator! में व्यक्त किए basic_ios::operator! , operator bool और operator void*

क्या कोई मुझे अपने दुख से बाहर कर सकता है और यह समझा सकता है, इसलिए मुझे कभी दोबारा सोचने की ज़रूरत नहीं है?

वेब के समाधान से एकत्रित समाधान "मूल_ओआईएस पर झंडे की शब्दावली"

तीन झंडे हैं जो त्रुटि राज्य का संकेत देते हैं:

  • badbit मतलब है कि धारा के साथ कुछ गलत हो गया है। यह एक बफर त्रुटि या स्ट्रीम में डेटा खिला रही है जो कुछ भी एक त्रुटि हो सकती है यदि यह ध्वज सेट है, तो यह संभव है कि आप स्ट्रीम का उपयोग नहीं कर रहे हैं।

  • failbit मतलब है कि धारा से निष्कासन या पढ़ना विफल (या आउटपुट स्ट्रीम के लिए एक लिखना या प्रविष्टि) और आपको उस विफलता से अवगत होना चाहिए।

  • eofbit अर्थ है इनपुट स्ट्रीम अपने समापन पर पहुंच गया है और पढ़ने के लिए कुछ भी नहीं बचा है ध्यान दें कि यह आपके द्वारा इनपुट स्ट्रीम से पढ़ने का प्रयास करने के बाद ही सेट किया गया है जो कि उसके अंत तक पहुंचा है (यानी यह तब सेट होता है जब कोई त्रुटि आती है क्योंकि आप उस डेटा को पढ़ने का प्रयास करते हैं जो वहां नहीं है)।

failbit भी कई परिचालनों द्वारा निर्धारित किया जा सकता है जो failbit तक पहुंचते हैं। उदाहरण के लिए, यदि केवल सफेद स्थान शेष स्ट्रीम में शेष है और आप एक int पढ़ने की कोशिश करते हैं, तो आप दोनों EOF तक पहुंचेंगे और आप int पढ़ने में असफल होंगे, इसलिए दोनों झंडे सेट हो जाएंगे।

fail() फ़ंक्शन का परीक्षण badbit || failbit badbit || failbit

good() फ़ंक्शन परीक्षण !(badbit || failbit || eofbit) यही है, एक धारा अच्छा है जब कोई भी बिट्स सेट नहीं हैं।

आप ios::clear() सदस्य फ़ंक्शन का उपयोग करके झंडे को रीसेट कर सकते हैं; यह आपको किसी भी त्रुटि झंडे को सेट करने की अनुमति देता है; डिफ़ॉल्ट रूप से (कोई तर्क नहीं के साथ), यह सभी तीन झंडे साफ करता है

धाराएं operator bool() ओवरलोड नहीं करतीं; operator void*() का उपयोग सुरक्षित बूल मुहावरों के कुछ हद तक टूटे हुए संस्करण को लागू करने के लिए किया जाता है। यदि यह badbit या failbit निर्धारित है, और अन्यथा गैर-रिक्त है, तो यह ऑपरेटर ओवरलोड नल देता है आप इसे किसी निष्कर्षण की सफलता के परीक्षण के मुहावरों के समर्थन के लिए उपयोग कर सकते हैं, जैसे किसी पाश या अन्य नियंत्रण प्रवाह वक्तव्य की स्थिति:

 if (std::cin >> x) { // extraction succeeded } else { // extraction failed } 

operator!() अधिभार operator void*() के विपरीत है operator void*() ; यह true रिटर्न करता true अगर badbit या failbit सेट हो और अन्यथा falseoperator!() अधिभार वास्तव में अब और आवश्यक नहीं है; यह पहले की तारीख से पहले ऑपरेटर ओवरलोड पूरी तरह से और लगातार समर्थन किया गया था ( एसबीआई का सवाल "क्यों एसटीडी :: बेसिकआईआईओएस ओपरल लॉजिकल एनैजेक्शन ऑपरेटर को ओवरलोड करता है?" )।

सी ++ 0x समस्या को हल करता है जिससे हमें सुरक्षित बूल मुहावरों का उपयोग करना पड़ता है, इसलिए सी ++ 0x में basic_ios बेस क्लास टेम्पलेट ओवरलोड operator bool() एक स्पष्ट रूपांतरण ऑपरेटर के रूप में करता है; इस ऑपरेटर का एक ही शब्दांकन मौजूदा operator void*()

जेम्स के उत्तर के अलावा, यह याद रखना महत्वपूर्ण है कि ये झंडे आपरेशन के परिणाम इंगित करते हैं, इसलिए जब तक आप एक प्रदर्शन नहीं करते हैं

ऐसा करने के लिए एक आम त्रुटि है:

 #include <fstream> #include <iostream> #include <string> int main() { std::ifstream file("main.cpp"); while (!file.eof()) // while the file isn't at eof... { std::string line; std::getline(file, line); // ...read a line... std::cout << "> " << line << std::endl; // and print it } } 

यहाँ समस्या यह है कि जब तक हम अंतिम पंक्ति प्राप्त करने की कोशिश करते हैं तब तक eof() सेट नहीं किया जाएगा, जिस बिंदु पर स्ट्रीम कहेंगे "नहीं, नहीं!" और इसे सेट करें इसका अर्थ है "सही" रास्ता:

 #include <fstream> #include <iostream> #include <string> int main() { std::ifstream file("main.cpp"); for (;;) { std::string line; std::getline(file, line); // read a line... if (file.eof()) // ...and check if it we were at eof break; std::cout << "> " << line << std::endl; } } 

यह चेक सही स्थान पर रखता है। यद्यपि यह बहुत अनियंत्रित है; सौभाग्य से हमारे लिए, std::getline लिए रिटर्न वैल्यू स्ट्रीम है, और स्ट्रीम में एक रूपांतरण ऑपरेटर होता है जो इसे बूलियन संदर्भ में जांचने की अनुमति देता है, fail() के मूल्य के साथ, जिसमें eof() शामिल है तो हम बस लिख सकते हैं:

 #include <fstream> #include <iostream> #include <string> int main() { std::ifstream file("main.cpp"); std::string line; while (std::getline(file, line)) // get line, test if it was eof std::cout << "> " << line << std::endl; }