2010-08-30 11 views
7

मैं खुद को एक सी ++ टेक्स्ट बुक के माध्यम से चला रहा हूं जो मेरे पास सी ++ प्रोग्रामिंग के लिए रीफ्रेशर है। अभ्यास समस्याओं में से एक (बहुत अधिक विस्तार के बिना) चाहता है कि मैं एक ऐसे फ़ंक्शन को परिभाषित करना चाहूंगा जो ifstream या cin (उदा। Istream) को तर्क के रूप में पारित किया जा सके। वहां से, मुझे धारा के माध्यम से पढ़ना है। परेशानी है, मैं इस एक फ़ंक्शन का उपयोग सीन और ifstream को प्रभावी रूप से स्ट्रीम के अंत को खोजने के लिए एक तरीका नहीं समझ सकता। अर्थात्,सीन और ifstream के लिए स्ट्रीम का अंत खोजें?

while(input_stream.peek() != EOF) 

सीन के लिए काम नहीं करेगा। मैं फ़ंक्शन को एक निश्चित वाक्यांश (जैसे "# स्ट्रीम ऑफ स्ट्रीम #" या कुछ) देखने के लिए फिर से काम कर सकता हूं, लेकिन मुझे लगता है कि यह एक बुरा विचार है कि अगर फ़ाइल स्ट्रीम पास करता है तो यह सटीक वाक्यांश है।

मैंने फ़ंक्शन ओवरलोडिंग का उपयोग करने के बारे में सोचा है, लेकिन अब तक पुस्तक ने उल्लेख किया है कि यह मुझे ऐसा करना चाहता है। मैं शायद इस अभ्यास की समस्या में बहुत अधिक प्रयास कर रहा हूं, लेकिन मैं रचनात्मक प्रक्रिया का आनंद लेता हूं और उत्सुक हूं यदि अधिभार के बिना ऐसा करने का कोई तरीका है।

+0

चेक: http://stackoverflow.com/questions/3197025/end-of-fileeof-of-standard-input

तो एक प्रोग्राम एक धारा से संख्या की एक धारा को पढ़ने के लिए -स्ट्रीम-स्टडीन – Archie

उत्तर

4

eof() सीन के लिए काम करता है। आप कुछ गलत कर रहे हैं; कृपया अपना कोड पोस्ट करें। एक आम स्टम्बलिंग ब्लॉक यह है कि eof ध्वज के बाद सेट हो जाता है, आप स्ट्रीम के अंत के पीछे पढ़ने की कोशिश करते हैं।

#include <iostream> 
#include <string> 

int main(int, char*[]) 
{ 
    std::string s; 
    for (unsigned n = 0; n < 5; ++n) 
    { 
     bool before = std::cin.eof(); 
     std::cin >> s; 
     bool after = std::cin.eof(); 
     std::cout << int(before) << " " << int(after) << " " << s << std::endl; 
    } 

    return 0; 
} 

और इसके उत्पादन:

यहाँ एक प्रदर्शन है

D:>t 
aaaaa 
0 0 aaaaa 
bbbbb 
0 0 bbbbb 
^Z 
0 1 bbbbb 
1 1 bbbbb 
1 1 bbbbb 

+0

भ्रम के लिए खेद है, मैंने शुरुआत में (! Input_stream.eof()) था, लेकिन फिर एहसास हुआ कि मैंने इसके दौरान लिखा था (input_stream.peek! = EOF)। भले ही, दोनों विधियां नियंत्रण + z के साथ काम करती हैं (विडंबना यह है कि मैं सिर्फ विकिपीडिया में ईफ चरित्र के बारे में पढ़ रहा था)। मदद एज़ज़ के लिए धन्यवाद, और हर कोई! – user435219

+0

स्ट्रीम को '.eof' या' .bad' पर एक बूलियन में परिवर्तित करना पसंद करते हैं। –

2

std::cin.eof() क्यों काम नहीं करेगा? cin ईडीओ को सिग्नल बंद कर देगा, जो तब होगा जब उपयोगकर्ता Ctrl + d (* nix) या Ctrl + z (विंडोज), या (पाइप इनपुट इनपुट के मामले में) पाइप होने पर यह होगा फ़ाइल

+1

विंडोज़ में यह 'Ctrl + Z' है,' Ctrl + D' यूनिक्स-आधारित सिस्टम के लिए है। – Archie

+0

@ आर्ची ओह, अच्छा बिंदु; जोड़ा गया है कि –

+0

आह में, यह वास्तव में काम करता है (वैसे भी विंडोज़ के लिए Ctrl + Z)। क्षमा करें, अगर मेरे पास मूल रूप से थोड़ी सी भ्रम है (! Input_stream.eof()) पहले पोस्ट में और इसे संपादित करने के दौरान (input_stream.peek()! = EOF)। किसी भी दर पर, मुझे चिंता करने के बारे में 1 चिंता है (! Input_stream.eof()) यह है कि जब फ़ंक्शन ईओएफ चरित्र को पढ़ता है तो विफल बिट इनपुट_स्ट्रीम के लिए सेट होता है। क्या यह होने के लिए माना गया है? – user435219

3
(EOF कई अन्य OSes पर Windows और Ctrl-D पर Ctrl-Z के साथ उत्पन्न किया जा सकता)

यदि आप एक बुलियन संदर्भ में एक स्ट्रीम का उपयोग करते हैं तो यह स्वयं को उस मान में परिवर्तित कर देगा जो सत्य के बराबर है यदि यह ईओएफ तक नहीं पहुंच गया है और गलत है अगर ईओएफ के पीछे पढ़ने के लिए प्रयास किया गया है (नहीं स्ट्रीम से पिछली त्रुटि पढ़ने पर भी झूठा है)।

चूंकि धाराओं पर अधिकांश आईओ संचालन धारा लौटाते हैं (इसलिए उन्हें जंजीर किया जा सकता है)। आप अपना पठन ऑपरेशन कर सकते हैं और परीक्षा में परिणाम (ऊपर के रूप में) का उपयोग कर सकते हैं। इस सवाल का

int main() 
{ 
    int x; 

    // Here we try and read a number from the stream. 
    // If this fails (because of EOF or other error) an internal flag is set. 
    // The stream is returned as the result of operator>> 
    // So the stream is then being used in the boolean context of the while() 
    // So it will be converted to true if operator>> worked correctly. 
    //       or false if operator>> failed because of EOF 
    while(std::cin >> x) 
    { 
     // The loop is only entered if operator>> worked correctly. 
     std::cout << "Value: " << x << "\n"; 
    } 

    // Exit when EOF (or other error). 
} 
संबंधित मुद्दे