2010-08-24 13 views
14

निम्नलिखित की तरह मैं स्वरूपित किया डेटा:सी ++ में स्वरूपित डेटा को कैसे पढ़ा जाए?

Words   5 
AnotherWord 4 
SomeWord  6

यह एक पाठ फ़ाइल में है और मैं ifstream उपयोग कर रहा हूँ इसे पढ़ने के लिए है, लेकिन मैं कैसे संख्या और शब्द को अलग करते हैं? शब्द में केवल वर्णमालाएं होंगी और शब्द और संख्या के बीच कुछ रिक्त स्थान या टैब होंगे, यह सुनिश्चित नहीं है कि कितने हैं।

+0

अगर यह शब्द और संख्या के बीच रिक्त स्थान या टैब है मैं नहीं जानता, वहाँ शब्द के भीतर रिक्त स्थान नहीं होगा। – TheOnly92

+0

यदि आपका फ़ाइल प्रारूप अधिक जटिल हो जाता है, तो आप प्रत्येक पंक्ति के लिए नियमित अभिव्यक्तियों को आजमा सकते हैं। बूस्ट उस के लिए एक lib प्रदान करता है। –

उत्तर

19

मान लिया जाये कि "शब्द" के भीतर किसी भी खाली स्थान के नहीं होगी (तो यह वास्तव में 1 शब्द नहीं होगा), तो यहां आपको फ़ाइल के अंत तक पढ़ने के लिए का एक नमूना है :

std::ifstream file("file.txt"); 
std::string str; 
int i; 

while(file >> str >> i) 
    std::cout << str << ' ' << i << std::endl; 
+0

क्या होगा यदि टैब शब्द और पूर्णांक को अलग कर रहे हैं? – TheOnly92

+0

@ द ओनली 9 2 यह सिर्फ काम करता है - विभाजक व्हाइटस्पेस – Mark

+0

कूल है, यह वह समाधान है जो मैं चाहता था। – TheOnly92

2

यह वास्तव में बहुत आसान है, तो आप आप डिलीमीटर के रूप में टैब का उपयोग कर रहे हैं, तो संदर्भ here
पा सकते हैं, तो आप getline बजाय का उपयोग करें और '\ t' के लिए परिसीमक तर्क सेट कर सकते हैं। एक लंबे समय तक उदाहरण होगा:

#include <vector> 
#include <fstream> 
#include <string> 

struct Line { 
    string text; 
    int number; 
}; 

int main(){ 
    std::ifstream is("myfile.txt"); 
    std::vector<Line> lines; 
    while (is){ 
     Line line; 
     std::getline(is, line.text, '\t'); 
     is >> line.number; 
     if (is){ 
      lines.push_back(line); 
     } 
    } 
    for (std::size_type i = 0 ; i < lines.size() ; ++i){ 
     std::cout << "Line " << i << " text: \"" << lines[i].text 
        << "\", number: " << lines[i].number << std::endl; 
    } 
} 
+1

'>> 'ऑपरेटर' std :: string' पढ़ता है। – Donotalo

+0

@ डोनातालो: यदि आप हां शामिल हैं। यद्यपि, यदि आप गेटलाइन का उपयोग करना चाहते हैं, तो आपको स्ट्रिंग को शामिल करने की आवश्यकता है, इसलिए आपके पास एक वैध बिंदु है :) मेरा उत्तर – Default

+0

संपादित किया गया है, यह वास्तव में सफेद जगहों के साथ स्ट्रिंग भी पढ़ेगा (इसमें '' t'' 'के अलावा)। मेरे पास इसके साथ कुछ समस्याएं हैं, हालांकि: 1. आपको वेक्टर पर धक्का देने से पहले तुरंत 'is' की जांच करनी होगी। 2. लूप को 'int' वापस करने से पहले त्रुटि जांच (और वैसे भी अनियंत्रित है)। मान लीजिए कि आप इन्हें ठीक कर देंगे, मैंने उनके बावजूद आपका उत्तर दिया है। – sbi

4

>> ऑपरेटर std::string के लिए ओवरराइड और एक विभाजक

तो

ifstream f("file.txt"); 

string str; 
int i; 
while (!f.eof()) 
{ 
    f >> str; 
    f >> i; 
    // do work 
} 
के रूप में खाली स्थान के उपयोग करता है
+0

मैंने 'printf ("% s =% d \ n ", str.c_str(), i) जोड़ा;' // // काम करने के बाद '। यह अंतिम पंक्ति ** दो बार ** प्रिंट करता है। एमएसवीसी 9 का उपयोग करना –

+0

@ एओआई करसु - हाँ, मुझे खेद है कि मैं केवल – Mark

+0

काम कर रहे चरबी में पढ़ रहा था 'f'eof() 'के बजाय लूप स्थिति के रूप में' f' 'का उपयोग करें। – rubenvb

2

sscanf कि के लिए अच्छा है:

#include <cstdio> 
#include <cstdlib> 

int main() 
{ 
    char sentence []="Words   5"; 
    char str [100]; 
    int i; 

    sscanf (sentence,"%s %*s %d",str,&i); 
    printf ("%s -> %d\n",str,i); 

    return EXIT_SUCCESS; 
} 
संबंधित मुद्दे