2012-10-02 32 views
12

संभव डुप्लिकेट:
Need help with getline()getline() करता है, तो कुछ आदानों के बाद इस्तेमाल किया काम नहीं करता है

getline() काम नहीं कर रहा है, अगर मैं कुछ आदानों के बाद इसका इस्तेमाल, यानी

#include<iostream> 
using namespace std; 

main() 
{ 
string date,time; 
char journal[23]; 


cout<<"Date:\t"; 
cin>>date; 
cout<<"Time:\t"; 
cin>>time; 

cout<<"Journal Entry:\t"; 
cin.getline(journal,23); 


cout<<endl; 
system("pause"); 
} 

जहां मैं इनपुट के शीर्ष पर getline() का उपयोग करता हूं, यह काम करता है यानी

cout<<"Journal Entry:\t"; 
cin.getline(journal,23); 
cout<<"Date:\t"; 
cin>>date; 
cout<<"Time:\t"; 
cin>>time; 

कारण क्या हो सकता है?

+1

कृपया परिभाषित "काम नहीं कर रहा है"। आपने क्या परिणाम अपेक्षित किए, और आपको क्या मिला? –

उत्तर

25

वर्ण तक या तो (1 एन) निकाले जाते हैं। इनपुट अनुक्रम में फ़ाइल का अंत तक पहुंचने पर इनपुट इनपुट इनपुट ऑपरेशन के दौरान होता है तो निष्कर्षण को भी रोकता है।

जब cin.getline() इनपुट से पढ़ता है, तो इनपुट स्ट्रीम में एक न्यूलाइन वर्ण छोड़ा जाता है, इसलिए यह आपके सी-स्ट्रिंग को नहीं पढ़ता है। cin.ignore() बीयर कॉलिंग getline() का उपयोग करें।

cout<<"Journal Entry:\t"; 
cin.ignore(); 
cin.getline(journal,23); 
+0

'int' अभी भी' \ n' के बारे में क्या है 'getline() 'के लिए समस्या का कारण बन गया? – UnKnown

+0

यह बहुत महत्वपूर्ण बात है और गेटलाइन की कार्यक्षमता समझाते हुए कई वेबसाइटों में इसका उल्लेख नहीं किया गया है। – ViruMax

2

आप स्ट्रीम स्थिति की जांच नहीं कर रहे हैं। std::cin स्ट्रीम निष्कर्षण ऑपरेटर (operator>>) असफल हो सकता है। जब ऐसा होता है, तो स्ट्रीम को "खराब" (failbit, badbit, या eofbit सेट किया गया है) के रूप में चिह्नित किया जाता है। एक बार "खराब" होने पर, उस स्ट्रीम पर आने वाली सभी धारा निष्कर्ष तब तक विफल हो जाएंगे जब तक आप स्थिति को साफ़ नहीं करते।

एक पागल प्रोग्रामर बनना सीखें। हमेशा उन स्वरूपित इनपुट संचालन की स्थिति की जांच करें। उदाहरण के लिए, आप एक अपवाद फेंक सकते हैं, या एक त्रुटि संदेश मुद्रित कर सकते हैं और बाहर निकलें। एक चीज जो आपको नहीं करना चाहिए वह यह मानना ​​है कि यह काम करता है। पात्रों निकाला गया है या परिसीमन चरित्र (जो परिसीमक है अगर इस पैरामीटर निर्दिष्ट किया जाता है, या '\ n' अन्यथा) पाया जाता है -

6

क्या @DavidHammen कहा करने के लिए जोड़ा जा रहा है:

निष्कर्षण संचालन धारा में पीछे चल '\n' चरित्र छोड़ दें। दूसरी ओर, istream::getline() इसे छोड़ देता है। तो जब आप एक निष्कर्षण ऑपरेटर के बाद getline पर कॉल करते हैं, '\n' यह पहला चरित्र है जो इसे मुठभेड़ करता है और यह वहां पढ़ने को रोकता है।

रखो इस से पहले के बाद getline कॉल निष्कर्षण:

cin.ignore()

इनपुट लेने कुछ इस तरह होगी इसका एक और अधिक मजबूत तरीका:

while (true) { 

    cout<<"Time:\t"; 
    if (cin>>time) { 
     cin.ignore(); // discard the trailing '\n' 
     break; 
    } else { 
     // ignore everything or to the first '\n', whichever comes first 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cin.clear(); // clear the error flags 
     cout << "Invalid input, try again.\n"; 
    } 
}