में कैसे काम करता है मैं कंप्यूटर विज्ञान छात्र हूं, इसलिए सी ++ भाषा के साथ अधिक अनुभव नहीं है (यह इस भाषा का उपयोग करके मेरा पहला सेमेस्टर है) या उस मामले के लिए कोडिंग।एक्स्ट्राक्ट >> ऑपरेटर सी ++
मैं की सरल रूप में एक पाठ फ़ाइल से पूर्णांकों को पढ़ने के लिए एक काम दिया गया था:
19 3 -2 9 14 4
5 -9 -10 3
.
.
.
यह मैं बेहतर समझने के लिए/ओ ऑपरेटरों, के बाद से मैं करने के लिए आवश्यक कर रहा हूँ एक यात्रा पर का मुझे भेजा इस स्ट्रीम के साथ कुछ चीजें (duh।)
मैं हर जगह देख रहा था और निकालने के लिए एक सरल स्पष्टीकरण नहीं मिला कि ऑपरेटर आंतरिक रूप से कैसे काम करता है। मुझे अपने प्रश्न को स्पष्ट करने दें:
मुझे पता है कि निकालने वाला >> ऑपरेटर अंतरिक्ष, टैब या न्यूलाइन हिट होने तक एक जारी तत्व निकालेगा। जो मैं समझने की कोशिश करता हूं वह है, पॉइंटर (?) या रीड-लोकेशन (?) कहां होगा, इसके बाद यह तत्व निकालेगा। क्या यह तत्व के अंतिम भाग पर हटा दिया जाएगा या इसे हटा दिया गया था और इसलिए चला गया? क्या यह अंतरिक्ष/टैब/'\ n' चरित्र पर ही होगा? शायद निकालने के लिए अगले तत्व की शुरुआत?
मुझे उम्मीद है कि मैं काफी स्पष्ट था। मेरी समस्या स्पष्ट करने के लिए मुझे सभी उचित शब्दकोष की कमी है। (मामले में किसी को भी सोच रहा है ...) आवश्यकताओं में से एक अलग से प्रत्येक पंक्ति में सभी पूर्णांकों योग करने के लिए है:
यहाँ कारण है कि मैं इस पता करने की जरूरत है। मैंने फ़ाइल के अंत तक पहुंचने तक सभी इंटीग्रियों को एक-एक करके निकालने के लिए एक लूप बनाया है। हालांकि, मुझे जल्द ही पता चला कि निकालने >> ऑपरेटर अंतरिक्ष/टैब/न्यूलाइन को अनदेखा करता है। मैं कोशिश करना चाहता हूं >> एक तत्व निकालने के लिए, और फिर space/tab/newline प्राप्त करने के लिए inputFile.get() का उपयोग करें। फिर, अगर यह एक नई लाइन है, तो मुझे जो करना है वह करो। यह केवल तभी काम करेगा जब स्ट्रीम पॉइंटर अंतिम निष्कर्षण के बाद स्पेस/टैब/न्यूलाइन निकालने के लिए अच्छी स्थिति में होगा।
In my previous question, मैं getline() और एक sstring का उपयोग कर इसे हल करने की कोशिश की।
समाधान:
कैसे ऑपरेटर >> काम करता है की मेरी विशिष्ट प्रश्न का जवाब दे, के लिए, मैं सबसे अच्छा एक के रूप में बेन वोइट के जवाब को स्वीकार करने के लिए किया था। मैंने यहां सुझाए गए अन्य समाधानों का उपयोग किया है (प्रत्येक पंक्ति के लिए एक एसस्ट्रिंग का उपयोग करके) और उन्होंने काम किया! हालांकि, मैं एक और समाधान लागू (आप मेरे पिछले प्रश्न के लिंक में देख सकते हैं) बेन के जवाब का उपयोग कर और यह भी काम किया:
.
.
.
if(readFile.is_open()) {
while (readFile >> newInput) {
char isNewLine = readFile.get(); //get() the next char after extraction
if(isNewLine == '\n') //This is just a test!
cout << isNewLine; //If it's a newline, feed a newline.
else
cout << "X" << isNewLine; //Else, show X & feed a space or tab
lineSum += newInput;
allSum += newInput;
intCounter++;
minInt = min(minInt, newInput);
maxInt = max(maxInt, newInput);
if(isNewLine == '\n') {
lineCounter++;
statFile << "The sum of line " << lineCounter
<< " is: " << lineSum << endl;
lineSum = 0;
}
}
.
.
.
के साथ मेरी संख्यात्मक मानों के लिए कोई संबंध है, प्रपत्र सही है! दोनों रिक्त स्थान और '\ n के catched गया:
धन्यवाद बेन वोइट :)
बहरहाल, इस समाधान बहुत प्रारूप निर्भर है और बहुत नाजुक है। यदि किसी भी पंक्ति में '\ n' (जैसे स्पेस या टैब) से पहले कुछ और है, तो कोड न्यूलाइन चार को याद करेगा। इसलिए, अन्य समाधान, getline() और sstrings का उपयोग कर, अधिक विश्वसनीय है।
लगता है आप पूरी लाइनों पढ़ना चाहते हैं, और फिर उन्हें अपने आप को पार्स। – Deduplicator
आप ज्यादातर अप्रासंगिक कार्यान्वयन विवरण के बारे में पूछ रहे हैं। 'ऑपरेटर >>' एक मूल्य निकालता है और धारा को आगे बढ़ाता है। यदि आप अधिक जटिल पार्सिंग चाहते हैं, तो असली पार्सर का उपयोग करें। –
क्या आपने 'get' को कॉल करने और यह जांचने का प्रयास किया कि आप किस चरित्र को प्राप्त कर रहे हैं? –