2008-11-02 11 views

उत्तर

78

संभवत:

std::cin.ignore(INT_MAX); 

इस में पढ़ सकते हैं और उपेक्षा होगा सब कुछ EOF तक। इसके अलावा '\n' एक लाइन की अनदेखी करने)

: (आप भी एक दूसरा तर्क जो चरित्र जब तक (पूर्व पढ़ने के लिए है की आपूर्ति कर सकते हैं। आप शायद एक क्या करना चाहते हैं:। धारा राज्य पुनर्स्थापित करने के लिए इससे पहले कि यह बहुत std::cin.clear();

+9

(पुराना मुझे पता है) नाम से पहले साफ़ करें, इसलिए स्ट्रीम को एक अच्छी स्थिति में रखा गया है जहां यह अपने बफर पर काम कर सकता है। – GManNickG

+0

धन्यवाद, जीएमएन! क्या यह गलत तरीका था, पहले, और मेरी गलती की तलाश में कुछ समय बिताया। – balu

+0

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

1

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

cin.flush(); 

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

cin.ignore(INT_MAX); 
+1

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

+0

आप सही हैं :) –

+0

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

96

मैं सी संस्करणों के ऊपर सी ++ आकार की कमी पसंद करेंगे:

// 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') 
+14

अधिक महत्वपूर्ण बात यह है कि मूल्य अलग हो सकते हैं! (स्ट्रीमसाइज int होना आवश्यक नहीं है) –

+1

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

+0

@ajay: नहीं। ऐसा कुछ है जिसे आपको तय करने की आवश्यकता होगी। मैं केवल यह बता रहा हूं कि उपर्युक्त क्या करेगा। –

3

मैं पसंद करते हैं:

cin.clear(); 
fflush(stdin); 

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

हालांकि, मानक के अनुसार fflush (stdin) अपरिभाषित व्यवहार है। fflush() केवल आउटपुट स्ट्रीम के लिए है। Fflush (stdin) केवल विंडोज़ पर अपेक्षित काम करता है (कम से कम जीसीसी और एमएस कंपाइलर्स के साथ) as an extension to the C standard

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

Using fflush(stdin) देखें।

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

+9

एफएफएलश (stdin); अनिर्धारित व्यवहार (सी प्रोग्रामिंग भाषा में) है, स्पष्ट रूप से एक वैध, कामकाजी क्लज की आपूर्ति के लिए 7.18.5.2/2 – Cubbi

+1

+1 में स्पष्ट रूप से कहा गया है। कुछ लोगों के पास नौकरियां हैं अन्य के मानकों हैं। – Mikhail

+3

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

3

कैसे के बारे में:

cin.ignore(cin.rdbuf()->in_avail()); 
+3

स्ट्रीमबफ का in_avail() फ़ंक्शन अविश्वसनीय है, और कई कार्यान्वयन शून्य वापस आते हैं। देखें: https://connect.microsoft।कॉम/विजुअल स्टूडियो/फीडबैक/विवरण/50 9 337/वीसी -8-9-एसस्ट्रीम-बेसिक-स्ट्रीमबफ-स्पूट-स्पुत-डॉट-एन्हांसमेंट-जीकैंट gnu's libC++ समान –

6
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"; 
15
cin.clear(); 
fflush(stdin); 

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

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

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

और उसके बाद कार्य का उपयोग

__fpurge(stdin) 
0

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

3

एक अन्य संभावित (मैनुअल) समाधान

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

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

+0

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

+0

यह केवल तभी काम कर रहा है जब रेखा का अंत हो, अन्यथा अनंत लूप –

7

मुझे इसके दो समाधान मिल गए हैं। जब यह एक नया ऑनलाइन करने के लिए हो जाता है

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

... कि इनपुट धारा को छोड़ दिया जाएगा:

पहले, और सबसे सरल, उदाहरण के लिए std::getline() उपयोग करने के लिए है। इस फ़ंक्शन here के बारे में और पढ़ें।

एक अन्य विकल्प सीधे को छोड़ देता है कि धारा यह है ...

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

गुड लक!

0

सबसे आसान तरीका:

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

यह सिर्फ CIN सूचक stdin स्ट्रीम और cin.clear() सभी त्रुटि झंडे को साफ करता है के अंत में इस तरह के EOF ध्वज के रूप में की स्थिति।

संबंधित मुद्दे