मैं C ++ में सिने बफर कैसे साफ़ करूँ?
मैं C ++ में सिने बफर कैसे साफ़ करूँ?
जवाबों:
संभवत:
std::cin.ignore(INT_MAX);
यह तब तक पढ़ेगा और जब तक सब कुछ नजरअंदाज नहीं करेगा EOF
। (आप एक दूसरे तर्क की भी आपूर्ति कर सकते हैं जो कि तब तक पढ़ने के लिए वर्ण है (उदा: '\n'
एक पंक्ति को अनदेखा करना)।
इसके अलावा: आप शायद ऐसा करना चाहते हैं: std::cin.clear();
इससे पहले भी स्ट्रीम स्टेट रीसेट करने के लिए।
मैं C संस्करणों पर C ++ आकार की बाधाओं को प्राथमिकता दूंगा:
// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
cin
को फ्लश करने के लिए ऊपर दिए गए पहले कथन का उपयोग करता हूं और उपयोग करता हूं cin
, तो यह इनपुट के लिए संकेत देता है जब तक कि मैं EOF
दबाकर दर्ज नहीं करता ctrl+d
?
cin.clear();
fflush(stdin);
सांत्वना से पढ़ते समय यही मेरे लिए काम करता था। हर दूसरे मामले में यह या तो \ n की कमी के कारण अनिश्चित काल तक पढ़ा जाएगा, या कुछ बफर में रहेगा।
संपादित करें: मुझे पता चला कि पिछले समाधान ने चीजों को बदतर बना दिया था। हालांकि यह काम करता है:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
मुझे इसके दो समाधान मिल गए हैं।
पहला, और सबसे सरल, std::getline()
उदाहरण के लिए उपयोग करना है:
std::getline(std::cin, yourString);
... यह एक नई लाइन में जाने पर इनपुट स्ट्रीम को छोड़ देगा। इस फंक्शन के बारे में यहाँ और पढ़ें ।
एक और विकल्प जो सीधे धारा को त्यागता है वह है ...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
सौभाग्य!
int i;
cout << "Please enter an integer value: ";
// cin >> i; leaves '\n' among possible other junk in the buffer.
// '\n' also happens to be the default delim character for getline() below.
cin >> i;
if (cin.fail())
{
cout << "\ncin failed - substituting: i=1;\n\n";
i = 1;
}
cin.clear(); cin.ignore(INT_MAX,'\n');
cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";
string myString;
cout << "What's your full name? (spaces inclded) \n";
getline (cin, myString);
cout << "\nHello '" << myString << "'.\n\n\n";
कैसा रहेगा:
cin.ignore(cin.rdbuf()->in_avail());
मैं पसंद करता हूं:
cin.clear();
fflush(stdin);
वहाँ एक उदाहरण है जहाँ Cin.ignore सिर्फ इसे काटता नहीं है, लेकिन मैं इस समय इसके बारे में सोच भी नहीं सकता। यह कुछ समय पहले था जब मुझे इसे (मिंगव के साथ) उपयोग करने की आवश्यकता थी।
हालांकि, फफ्लश (स्टडिन) मानक के अनुसार अपरिभाषित व्यवहार है। fflush () केवल आउटपुट स्ट्रीम के लिए है। Fflush (stdin) केवल C मानक के विस्तार के रूप में Windows (GCC और MS कंपाइलर के साथ) पर अपेक्षित रूप से काम करता है ।
इसलिए, यदि आप इसका उपयोग करते हैं, तो आपका कोड पोर्टेबल नहीं होगा।
Fflush का उपयोग करके देखें (स्टडिन) ।
इसके अलावा, http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount1 एक विकल्प देखें।
एक और संभावित (मैनुअल) समाधान है
cin.clear();
while (cin.get() != '\n')
{
continue;
}
मैं क्लेयन के साथ fflush या cin.flush () का उपयोग नहीं कर सकता इसलिए यह काम आया।
सबसे आसान उपाय:
cin.seekg(0,ios::end);
cin.clear();
यह स्टड स्ट्रीम के अंत में सिनेम पॉइंटर को तैनात करता है और Cin.clear () ईओएफ ध्वज जैसे सभी त्रुटि झंडे को साफ करता है।
निम्नलिखित काम करना चाहिए:
cin.flush();
कुछ प्रणालियों पर यह उपलब्ध नहीं है और फिर आप उपयोग कर सकते हैं:
cin.ignore(INT_MAX);
flush
विधि केवल आउटपुट के लिए है, और पहले से ही लिखित वर्णों से संबंधित है।
basic_istream<char>' has no member named 'flush'
cin.get()
यह स्वचालित रूप से पर्याप्त रूप से पर्याप्त रूप से फ्लश करने लगता है (शायद यह पसंद नहीं है, क्योंकि यह भ्रामक है और शायद स्वभाव है)।
इसने मेरे लिए काम किया। मैंने गेटलाइन के साथ लूप के लिए उपयोग किया है ()।
cin.ignore()