2012-02-10 14 views
9

मैं कैसे पता लगा सकता हूं कि कोई रेखा खाली है या नहीं?सी ++ में आईट्रीम ऑब्जेक्ट से पढ़ने के दौरान खाली लाइनों का पता कैसे लगाएं?

मेरे पास है:

1 
2 
3 
4 

5 

मैं IStream आर तो साथ इस पढ़ रहा हूँ:

int n; 
r >> n 

मैं चाहता हूँ पता करने के लिए जब मैं अंतरिक्ष तक पहुँचने 4 और के बीच 5. मैं पढ़ रहा करने की कोशिश की char के रूप में और .peek() का पता लगाने के लिए \ n लेकिन यह पता चलता है \ n जो नंबर 1 के बाद जाता है। उपर्युक्त इनपुट का अनुवाद है: 1 \ n2 \ n3 \ n4 \ n \ n5 \ n अगर मैं सही हूं ...

चूंकि मैं इनट्स में हेरफेर करने जा रहा हूं, इसलिए मैं उन्हें उपयोग करने से इंट्स के रूप में पढ़ता हूं गेटलाइन और फिर int में परिवर्तित ...

+4

¤ 'std :: getline' का उपयोग करके प्रत्येक पंक्ति को 'std :: string' में पढ़ें। स्ट्रिंग लंबाई की जांच करें। उदाहरण का प्रयोग करें इनपुट की रेखा से अलग-अलग आइटम पढ़ने के लिए 'std :: istringstream'। यह आपको गलत इनपुट के साथ भी मदद करेगा। चीयर्स और एचटी।, –

+1

ओह, मैंने अभी अंतिम पैराग्राफ देखा है, जो बताता है "मैं सबसे आसान और सबसे उचित तरीका का उपयोग नहीं करना चाहता हूं"। उस मामले में वस्तुतः ज़्यादा जटिल तरीके हैं। केवल एक की कल्पना मूर्खतापूर्ण फैशन में कुछ करने के तरीकों पर सीमा डाल सकती है। चीयर्स, –

+2

ठीक है आपको कठोर होना जरूरी नहीं है। कम से कम मैंने इसे पोस्ट करने से पहले विभिन्न तरीकों का प्रयास किया। मैं सिर्फ यह जानना चाहता था कि कोई दूसरा तरीका है या नहीं। मैं सिर्फ सी ++ एटीएम सीख रहा हूं। आईटिंगस्ट्रीम टिप्पणी के लिए धन्यवाद हालांकि, मैं उस गेटलाइन के साथ मिश्रित कोशिश करने जा रहा हूं! यदि आप चाहें तो इसे उत्तर के रूप में पोस्ट कर सकते हैं, और मैं इसे स्वीकार करूंगा। – bb2

उत्तर

16

यह ऐसा दिखाई दे सकता:

#include <iostream> 
#include <sstream> 
using namespace std; 

int main() 
{ 
    istringstream is("1\n2\n3\n4\n\n5\n"); 
    string s; 
    while (getline(is, s)) 
    { 
     if (s.empty()) 
     { 
      cout << "Empty line." << endl; 
     } 
     else 
     { 
      istringstream tmp(s); 
      int n; 
      tmp >> n; 
      cout << n << ' '; 
     } 
    } 
    cout << "Done." << endl; 
    return 0; 
} 

उत्पादन:

1 2 3 4 Empty line. 
5 Done. 

आशा इस मदद करता है।

+0

मुझे खाली रेखा के बारे में जानने की आवश्यकता है क्योंकि इनपुट उस रिक्त स्थान से अलग ब्लॉक द्वारा विभाजित है। और मुझे यह जानने की जरूरत है कि कौन सा डेटा ब्लॉक पर जाता है। – bb2

+2

@ बीबी 2: उस स्थिति में मैं प्रत्येक पंक्ति को 'स्ट्रिंग' के रूप में पढ़ने के लिए निश्चित रूप से 'std :: getline' का उपयोग करूंगा। फिर आप उस स्ट्रिंग के आधार पर अस्थायी 'istringstream' बना सकते हैं और इससे पढ़ सकते हैं। मैंने अपना जवाब संपादित कर लिया है। – LihO

+0

मैंने अभी देखा है कि आपके प्रश्न पर टिप्पणी में अल्फ पी। स्टीनबाक द्वारा समाधान की भी सिफारिश की गई थी। – LihO

4

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

#include <iostream> 
using namespace std; 


int main() 
{ 
    int x; 
    while (!cin.eof()) 
    { 
     cin >> x; 
     cout << "Number: " << x << endl; 

     char c1 = cin.get(); 
     char c2 = cin.peek(); 

     if (c2 == '\n') 
     { 
      cout << "There is a line" << endl; 
     } 
    } 
} 

लेकिन ध्यान रखें कि यह पोर्टेबल नहीं है। जब आप सिस्टम का उपयोग करते हैं जिसमें '\ n' की तुलना में अलग-अलग अंत रेखाएं होती हैं तो समस्या होगी। पूरी लाइनें पढ़ने पर विचार करें और उसके बाद डेटा निकालें।

+0

यह सच नहीं है कि यह गैर पोर्टेबल है। सिस्टम की न्यूलाइन चार (ओं) को '\ n' में परिवर्तित किया जाता है। – rasmus

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