मैं सिने बफर कैसे फ्लश करूं?


जवाबों:


101

संभवत:

std::cin.ignore(INT_MAX);

यह तब तक पढ़ेगा और जब तक सब कुछ नजरअंदाज नहीं करेगा EOF। (आप एक दूसरे तर्क की भी आपूर्ति कर सकते हैं जो कि तब तक पढ़ने के लिए वर्ण है (उदा: '\n'एक पंक्ति को अनदेखा करना)।

इसके अलावा: आप शायद ऐसा करना चाहते हैं: std::cin.clear();इससे पहले भी स्ट्रीम स्टेट रीसेट करने के लिए।


10
(पुराना मुझे पता है।) पहले स्पष्ट करें, बल्कि, इसलिए धारा को एक अच्छी स्थिति में रखा जाए जहां वह अपने बफर पर काम कर सके।
GMANNICKG

धन्यवाद, GMan! क्या यह गलत तरीका है, पहले, और मेरी गलती की तलाश में काफी समय बिताया।
बालू

@GManNickG, बस जवाब तय किया।
bwDraco

@ डोरलॉगॉर्ड: स्पष्ट समाधान, जो मुझे हेंडसाइट में करना चाहिए था, धन्यवाद। :)
GManNickG

3
बस यह बताना चाहता हूं कि मेरे मामले के लिए, मुझे '\ n' आवश्यक लगता है। अन्यथा बाद में "Cin >>" काम नहीं करता है।
कार्डिन नोव

114

मैं 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')

15
इससे भी महत्वपूर्ण बात, मान भिन्न हो सकते हैं! (स्ट्रीम में अंतर नहीं होना चाहिए)

2
क्या आप कृपया एक उदाहरण का हवाला दे सकते हैं जहाँ हमें फ़ाइल के अंत तक अनदेखा करने की आवश्यकता है क्योंकि यदि मैं बफर cinको फ्लश करने के लिए ऊपर दिए गए पहले कथन का उपयोग करता हूं और उपयोग करता हूं cin, तो यह इनपुट के लिए संकेत देता है जब तक कि मैं EOFदबाकर दर्ज नहीं करता ctrl+d?
अजय

@ अजय: नहीं। यह आपको तय करना होगा। मैं केवल यह बता रहा हूं कि ऊपर वाला क्या करेगा।
मार्टिन यॉर्क

23
cin.clear();
fflush(stdin);

सांत्वना से पढ़ते समय यही मेरे लिए काम करता था। हर दूसरे मामले में यह या तो \ n की कमी के कारण अनिश्चित काल तक पढ़ा जाएगा, या कुछ बफर में रहेगा।

संपादित करें: मुझे पता चला कि पिछले समाधान ने चीजों को बदतर बना दिया था। हालांकि यह काम करता है:

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

13

मुझे इसके दो समाधान मिल गए हैं।

पहला, और सबसे सरल, std::getline()उदाहरण के लिए उपयोग करना है:

std::getline(std::cin, yourString);

... यह एक नई लाइन में जाने पर इनपुट स्ट्रीम को छोड़ देगा। इस फंक्शन के बारे में यहाँ और पढ़ें ।

एक और विकल्प जो सीधे धारा को त्यागता है वह है ...

#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

सौभाग्य!


9
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";


4

मैं पसंद करता हूं:

cin.clear();
fflush(stdin);

वहाँ एक उदाहरण है जहाँ Cin.ignore सिर्फ इसे काटता नहीं है, लेकिन मैं इस समय इसके बारे में सोच भी नहीं सकता। यह कुछ समय पहले था जब मुझे इसे (मिंगव के साथ) उपयोग करने की आवश्यकता थी।

हालांकि, फफ्लश (स्टडिन) मानक के अनुसार अपरिभाषित व्यवहार है। fflush () केवल आउटपुट स्ट्रीम के लिए है। Fflush (stdin) केवल C मानक के विस्तार के रूप में Windows (GCC और MS कंपाइलर के साथ) पर अपेक्षित रूप से काम करता है

इसलिए, यदि आप इसका उपयोग करते हैं, तो आपका कोड पोर्टेबल नहीं होगा।

Fflush का उपयोग करके देखें (स्टडिन)

इसके अलावा, http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount1 एक विकल्प देखें।


9
fflush (stdin); अपरिभाषित व्यवहार है (सी प्रोग्रामिंग भाषा में), स्पष्ट रूप से 7.18.5.2/2 में ऐसा कहा गया है
क्यूबाई

1
एक वैध, काम करने वाले कीचड़ की आपूर्ति के लिए +1। कुछ लोगों के पास रोजगार है दूसरों के मानक हैं।
मिखाइल

5
@ मिखाइल: आपकी नौकरी में मानक अनुरूप कोड लिखना शामिल होना चाहिए। मैं भविष्य में आपके द्वारा लिखी गई किसी भी चीज़ का उपयोग करने से बचना सुनिश्चित करूँगा।
एड एस।

4

एक और संभावित (मैनुअल) समाधान है

cin.clear();
while (cin.get() != '\n') 
{
    continue;
}

मैं क्लेयन के साथ fflush या cin.flush () का उपयोग नहीं कर सकता इसलिए यह काम आया।


मेरे लिए अनंत लूप।
StarWind0

लाइन के अंत होने पर ही यह काम कर रहा है, अन्यथा अनंत लूप
बोबुल मेंटोल

2

सबसे आसान उपाय:

cin.seekg(0,ios::end);
cin.clear();

यह स्टड स्ट्रीम के अंत में सिनेम पॉइंटर को तैनात करता है और Cin.clear () ईओएफ ध्वज जैसे सभी त्रुटि झंडे को साफ करता है।


1

निम्नलिखित काम करना चाहिए:

cin.flush();

कुछ प्रणालियों पर यह उपलब्ध नहीं है और फिर आप उपयोग कर सकते हैं:

cin.ignore(INT_MAX);

1
जब आप EOF तक पहुंचते हैं तब तक आप पढ़े गए INT_MAX चार्ट को अनदेखा कर सकते हैं, जब आप एक लूप लिखते हैं, तो यह ईओएफ (दूसरे पैरा का डिफ़ॉल्ट मान) तक पहुंच जाता है।
इवान टेरान

केवल इस मामले को दर्शाने के लिए, आपकी पोस्ट को संपादित करने के लिए गुनार बेहतर हो सकता है।
दना द साने

1
जहां तक ​​मैं बता सकता हूं, flushविधि केवल आउटपुट के लिए है, और पहले से ही लिखित वर्णों से संबंधित है।
मार्क वैन लीउवेन

cin.flush ():basic_istream<char>' has no member named 'flush'
eric

1
#include <stdio_ext.h>

और फिर फ़ंक्शन का उपयोग करें

__fpurge(stdin)

0

cin.get() यह स्वचालित रूप से पर्याप्त रूप से पर्याप्त रूप से फ्लश करने लगता है (शायद यह पसंद नहीं है, क्योंकि यह भ्रामक है और शायद स्वभाव है)।


0

इसने मेरे लिए काम किया। मैंने गेटलाइन के साथ लूप के लिए उपयोग किया है ()।

cin.ignore()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.