2009-01-25 9 views
8

मैं std :: ifstream का उपयोग करके अगली पंक्ति में कैसे जा सकता हूं और स्थानांतरित कर सकता हूं?ifstream, लाइन के अंत और अगली पंक्ति में ले जाएँ?

void readData(ifstream& in) 
{ 
    string sz; 
    getline(in, sz); 
    cout << sz <<endl; 
    int v; 
    for(int i=0; in.good(); i++) 
    { 
     in >> v; 
     if (in.good()) 
      cout << v << " "; 
    } 
    in.seekg(0, ios::beg); 
    sz.clear(); 
    getline(in, sz); 
    cout << sz <<endl; //no longer reads 
} 

मुझे पता है कि अगर कोई त्रुटि हुई तो मुझे अच्छा लगेगा लेकिन स्ट्रीम होने पर स्ट्रीम अब काम नहीं करेगा। मैं यह देखने के लिए कैसे जांच सकता हूं कि क्या मैं एक और int पढ़ने से पहले लाइन के अंत में हूं?

उत्तर

3

लूप के बाद आपको in.clear(); के साथ स्ट्रीम की त्रुटि स्थिति को साफ़ करना चाहिए, तो स्ट्रीम फिर से काम करेगी जैसे कोई त्रुटि नहीं हुई है। अगर आपरेशन सफल रहा

while (in >> v) { 
    cout << v << " "; 
} 
in.clear(); 

धारा निष्कर्षण रिटर्न, तो आप स्पष्ट रूप से in.good(); जाँच के बिना सीधे इस परीक्षण कर सकते हैं:

तुम भी करने के लिए अपने पाश को आसान बनाने में कर सकते हैं।

+0

यह संभव है के लिए एक वैध पूर्णांक के अंत फ़ाइल से तुरंत पालन किया जाना। सफलता के रूप में इसे पार्स करने पर विचार करने के लिए आपको झूठी के लिए .fail() की जांच करने की आवश्यकता है, क्योंकि in.good() फ़ाइल के अंत तक निष्कर्ष निकाला जाता है, भले ही निष्कर्षण ऑपरेशन सफल हो। –

+0

दिलचस्प चार्ल्स! –

+0

@ चार्ल्स: निहित 'ऑपरेटर शून्य * 'कॉल' असफल ', इसलिए' जबकि (में >> v) 'निष्कर्ष सफल होगा यदि निष्कर्ष सफल हो, भले ही ईओएफ राज्य। – dalle

16

उपयोग पर ध्यान न दें() अगली पंक्ति जब तक सब कुछ अनदेखी करने के लिए:

in.ignore(std::numeric_limits<std::streamsize>::max(), '\n') 

आप इसे मैन्युअल सिर्फ othe चरित्र की जांच करता है, तो '\ n'

char next; 
while(in.get(next)) 
{ 
    if (next == '\n') // If the file has been opened in 
    { break;  // text mode then it will correctly decode the 
    }     // platform specific EOL marker into '\n' 
} 
// This is reached on a newline or EOF 

यह वह जगह है यह देखने के लिए क्या करना चाहिए तो शायद असफल हो क्योंकि आप खराब बिट्स को साफ़ करने से पहले एक खोज कर रहे हैं।

in.seekg(0, ios::beg); // If bad bits. Is this not ignored ? 
          // So this is not moving the file position. 
sz.clear(); 
getline(in, sz); 
cout << sz <<endl; //no longer reads