2010-06-21 15 views
5

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

#include<iostream> 
#include<string> 
#include<fstream> 
#include<cstdio> 
using namespace std; 

int main() 
{ 
    ifstream InputFile("hello.txt") ; 
    string store ; 
    char * token; 

    while(getline(InputFile,store)) 
    { 
     cout<<as<<endl; 
     token = strtok(&store[0]," "); 
     cout<<token; 
     while(token!=NULL) 
     { 
     token = strtok(NULL," "); 
     cout<<token<<" "; 
     } 

    } 

} 

उत्तर

3

मैं सी ++ के लिए नया हूँ, लेकिन मुझे लगता है कि एक वैकल्पिक दृष्टिकोण हो सकता है:

while(getline(InputFile, store)) 
{ 
    stringstream line(store); // include <sstream> 
    string token;   

    while (line >> token) 
    { 
     cout << "Token: " << token << endl; 
    } 
} 

यह आपकी फ़ाइल लाइन-दर-रेखा को पार्स करेगा और प्रत्येक लाइन को व्हाइटस्पेस अलगाव के आधार पर टोकन करेगा (इसलिए इसमें और वें शामिल हैं एक बस रिक्त स्थान, जैसे टैब, और नई लाइनें)।

+0

सहमत: यदि ओपी का असली उपयोग केस प्रश्न में प्रस्तुत किया गया है (व्हाइटस्पेस पर विभाजित), तो एक स्ट्रिंगस्ट्रीम एक बहुत अच्छा विचार है। –

2

ठीक है, यहां एक समस्या है। strtok() एक शून्य-समाप्त स्ट्रिंग लेता है, और std::string की सामग्री आवश्यक रूप से शून्य-समाप्त नहीं होती है।

आप इस पर c_str() को फोन करके एक std::string से एक अशक्त-समाप्त स्ट्रिंग प्राप्त कर सकते हैं, लेकिन यह रिटर्न एक const char* (अर्थात, स्ट्रिंग नहीं परिवर्तनीय है)। strtok()char* लेता है और इसे कहने पर स्ट्रिंग को संशोधित करता है।

std::string s("hello, world"); 
std::vector<char> v(s.begin(), s.end()); 
v.push_back('\0'); 

अब आप उपयोग कर सकते हैं:

तुम सच में strtok() उपयोग करना चाहते हैं, तो मेरी राय में साफ विकल्प के लिए एक std::vector और अशक्त-समाप्त वेक्टर में std::string से पात्रों की नकल के लिए होगा एक नल-टर्मिनेटेड स्ट्रिंग के रूप में वेक्टर की सामग्री (&v[0] का उपयोग करके) और strtok() पर पास करें।

यदि आप बूस्ट का उपयोग कर सकते हैं, तो मैं Boost Tokenizer का उपयोग करने की सलाह दूंगा। यह एक स्ट्रिंग टोकनिंग के लिए एक बहुत साफ इंटरफ़ेस प्रदान करता है।

+1

मुझे आश्चर्य है कि डाउनवोट क्यों; मैंने एक वेक्टर गारंटीकृत संगतता का उपयोग करने का सोचा। – dreamlax

+1

शायद ऐसा इसलिए है क्योंकि उसने देखा कि आपके पास 30.8k प्रतिनिधि अंक, 3 स्वर्ण सितारों, 75 चांदी और सभी कांस्य थे और सोचा था कि आप एक डाउनवोट का उपयोग कर सकते हैं। – sashang

0

जेम्स मैकनेलिस क्या कहता है सही है।

एक त्वरित समाधान के लिए

(हालांकि नहीं सबसे अच्छा), बजाय

string store 

उपयोग

const int MAX_SIZE_LINE = 1024; //or whatever value you consider safest in your context. 
char store[MAX_SIZE_LINE]; 
संबंधित मुद्दे