2011-01-17 9 views
8

fscanf के रूप में उपयोग करते हुए मान लें कि मैं एक इनपुट के रूप में निम्नानुसार है:ifstream

N (X_1,Y_1) (X_2,Y_2) .... (X_N, Y_N) 

जहां N, x_i और Y_i पूर्णांक हैं।

एक उदाहरण:

2 (55,1) (521,7) 

इस पढ़ने के लिए, मैं इस तरह कुछ कर सकते हैं (सभी चर मान परिभाषित कर रहे हैं, आदि):

fscanf(fin,"%d ",&N); 
for (int i = 0; i < N; i++) 
    fscanf(fin,"(%d,%d) ", &X[i], &Y[i]); 

सवाल है, मैं कैसे कर सकते हैं यह आसानी से ifstream का उपयोग कर। मैं स्ट्रिंग प्राप्त कर सकता हूं, और फिर मैं नोडिगिट से छुटकारा पा सकता हूं और स्ट्रिंगस्ट्रीम का उपयोग करके मुझे दो नंबर मिल सकते हैं लेकिन यह थोड़ा बोझिल लगता है। क्या कोई आसान, अधिक सुरुचिपूर्ण तरीका है?

धन्यवाद

+0

क्यों न सिर्फ scanf का उपयोग के रूप में आप पहले से ही कर रहे हैं? या आप पूछ रहे हैं क्योंकि आप सीखना चाहते हैं? – falstro

+0

मैं सिर्फ इसलिए पूछ रहा हूं क्योंकि मैं सीखना चाहता हूं =) – kolistivra

+3

पिछली बार जब मैंने सी + शैली कार्यक्रम में सी-स्टाइल आईओ का उपयोग करने का सुझाव दिया तो एसओ पर सभी सी ++ अभिजात वर्ग सभी मेरे पास गए थे। – dreamlax

उत्तर

6
int n, x, y; 
char c; 
if (is >> n) 
    for (int i = 0; i < n; ++i) 
     if (is >> c && c == '(' && 
      is >> x && 
      is >> c && c == ',' && 
      is >> y && 
      is >> c && c == ')') 
     { 
      X[i] = x; 
      Y[i] = y; 
     } 
     else 
      throw std::runtime_error("invalid inputs"); 

आप को ऊपर सभी महत्वपूर्ण आंतरिक if हालत को आसान बनाने में कर सकते हैं ...

is >> chlit('(') >> x >> chlit(',') >> y >> chlit(')') 

... एक विशिष्ट चरित्र लेने के लिए एक सरल समर्थन प्रकार के साथ:

struct chlit 
{ 
    chlit(char c) : c_(c) { } 
    char c_; 
}; 

inline std::istream& operator>>(std::istream& is, chlit x) 
{ 
    char c; 
    if (is >> c && c != x.c_) 
     is.setstate(std::iostream::failbit); 
    return is; 
} 

इस on ideone here को चित्रित करने वाला एक संपूर्ण कार्यक्रम देखें।

मेरा एक पुराना पोस्ट विशिष्ट तारों का उपभोग करने के लिए कुछ समान था। (उपरोक्त chlit एक टेम्पलेट हो सकता है, लेकिन chlit<','>() पढ़ने और लिखने के लिए बदसूरत है - मैं संकलक पर भरोसा करता हूं)।

+0

3 लाइनों से 15 तक। । । मुझे वास्तव में सी ++ पसंद है लेकिन कभी-कभी iostreams काम करना मुश्किल हो सकता है। – dreamlax

+0

कम से कम यह इनपुट में कुछ अप्रत्याशित होने पर स्मृति को ओवरराइट नहीं करेगा। –

+0

@Anders: fscanf अप्रत्याशित इनपुट पर स्कैनिंग रोकता है, और सफलतापूर्वक स्कैन किए गए आइटमों की संख्या देता है। – dreamlax

3
cin >> N; 
for (int i = 0; i < N; i++) 
{ 
    cin.ignore(100,'('); 
    cin >> X[i]; 
    cin.ignore(100,','); 
    cin >> Y[i]; 
    cin.ignore(100,')'); 
} 

यह भी व्हाइटस्पेस संभाल कर सकते हैं के रूप में यह की तरह इनपुट पढ़ सकते हैं: ideone पर

2 ( 1 , 3 ) ( 5 , 6 ) 

प्रदर्शन: http://www.ideone.com/hO0xG