2009-03-16 11 views
7

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

फ़ाइल: example.txt (फ़ाइल को पढ़ने के लिए)।

हाय, हैलो क्या सुखद आश्चर्य है।
इस जगह पर आपका स्वागत है।
क्या आपके यहां सुखद आवास हो सकता है।
(3 लाइनें, और कुछ शब्द)।

Readfile.cpp

#include <iostream> 
#include <fstream> 
#include<string> 
using namespace std; 
int main() 
{ 
    ifstream in("example.txt"); 
    int count = 0; 

    if(!in) 
    { 
    cout << "Cannot open input file.\n"; 
    return 1; 
    } 

    char str[255]; 
    string tok; 
    char * t2; 

    while(in) 
    { 
    in.getline(str, 255); 
    in>>tok; 
    char *dup = strdup(tok.c_str()); 
    do 
    { 
     t2 = strtok(dup," "); 
    }while(t2 != NULL); 
    cout<<t2<<endl; 
    free (dup); 
    count++; 
    } 
    in.close(); 
    cout<<count; 
    return 0; 
} 
+0

आप की तुलना में "काम नहीं किया" और अधिक कहने की जरूरत है। हमें बताएं कि आपको क्या त्रुटि मिलती है, या विशिष्ट बात यह है कि आपका प्रोग्राम अपेक्षा से अलग करता है, फिर एक विशिष्ट प्रश्न पूछें। हम आपके लिए अपना होमवर्क डीबग या फिर से लिख नहीं पाएंगे। – Blorgbeard

+17

निम्नलिखित में से कुछ उदाहरणों के बारे में: http://www.codeproject.com/KB/recipes/Tokenizer.aspx वे बहुत ही कुशल और कुछ हद तक सुरुचिपूर्ण हैं। स्ट्रिंग टूलकिट लाइब्रेरी सी ++ में जटिल स्ट्रिंग प्रसंस्करण को सरल और आसान बनाता है। –

उत्तर

0

अपने जबकि पाश में अपने cout<<t2<<end; बयान ले जाने का प्रयास।

यह आपके कोड को मूल रूप से कार्यात्मक बनाना चाहिए।

आप अन्य दृष्टिकोणों के लिए this similar post देख सकते हैं।

0

इस तरह के उदाहरण इंटरनेट पर पोस्ट किए गए हैं। यहां एक गिनती शब्द है जो मैंने लिखा था जब मैं हाईस्कूल में था। इसे शुरुआती बिंदु के रूप में प्रयोग करें। अन्य चीजें जिन्हें मैं इंगित करना चाहता हूं:

std :: stringstream: आप std :: पूरी लाइन को गेटलाइन करें, फिर std :: स्ट्रिंगस्ट्रीम का उपयोग छोटे टुकड़ों में काटने और इसे टोकन करने के लिए करें। आप std :: getline का उपयोग करके पूरी लाइन प्राप्त कर सकते हैं और उसे std :: स्ट्रिंग में इनपुट कर सकते हैं, जिसे आप std :: स्ट्रिंगस्ट्रीम पर भेज सकते हैं।

एक बार फिर, यह केवल एक उदाहरण है और आप जो भी करना चाहते हैं वह ठीक नहीं करेंगे, आपको इसे करने के लिए इसे स्वयं संशोधित करने की आवश्यकता होगी!

#include <iostream> 
#include <map> 
#include <string> 
#include <cmath> 
#include <fstream> 

// Global variables 
     std::map<std::string, int> wordcount; 
     unsigned int numcount; 

void addEntry (std::string &entry) { 
     wordcount[entry]++; 
     numcount++; 
     return; 
} 


void returnCount() { 
     double percentage = numcount * 0.01; 
     percentage = floor(percentage + 0.5f); 

     std::map<std::string, int>::iterator Iter; 

     for (Iter = wordcount.begin(); Iter != wordcount.end(); ++Iter) { 
       if ((*Iter).second > percentage) { 
         std::cout << (*Iter).first << " used " << (*Iter).second << " times" << std::endl; 
       } 
     } 

} 

int main(int argc, char *argv[]) { 
     if (argc != 2) { 
       std::cerr << "Please call the program like follows: \n\t" << argv[0] 
         << " <file name>" << std::endl; 
       return 1; 
     } 

     std::string data; 

     std::ifstream fileRead; 
     fileRead.open(argv[1]); 
     while (fileRead >> data) { 
       addEntry(data); 
     } 
     std::cout << "Total words in this file: " << numcount << std::endl; 
     std::cout << "Words that are 1% of the file: " << std::endl; 
     returnCount(); 
} 
+0

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

+0

रवि: जिस कोड में मैंने आपको दिया है, वह आपको आधा रास्ता देगा। हम आपके लिए अपना होमवर्क करने के लिए यहां नहीं हैं! –

+0

ओह नहीं! मेरा ऐसा कोई इरादा नहीँ था। मुझे केवल पहले भाग में परेशानी हो रही है। एक बार यह तय हो जाने के बाद मैं अपने आप को बाकी करने का इरादा रखता हूं। –

5

बस यह अधिकार मिला !! बस सभी अनावश्यक कोड हटा दिए गए।

int main() 
{  
    ifstream in("example.txt"); 
    int LineCount = 0; 
    char* str = new char[500]; 

    while(in) 
    { 
     LineCount++; 
     in.getline(str, 255); 
     char * tempPtr = strtok(str," "); 
     while(tempPtr) 
     { 
      AddWord(tempPtr, LineCount); 
      tempPtr = strtok(NULL," ,."); 
     } 
    } 
    in.close(); 
    delete [] str; 
    cout<<"Total No of lines:"<<LineCount<<endl; 
    showData(); 

    return 0; 
} 

BTW मूल समस्या बयान एक सूचकांक कार्यक्रम है कि एक उपयोगकर्ता फ़ाइल को स्वीकार करने और सभी शब्दों की एक लाइन सूचकांक पैदा करेगा बनाने के लिए किया गया था।

+0

कृपया स्ट्रोक का उपयोग न करें। जैसे ही आपको मल्टी-थ्रेडेड कोड लिखना होगा, यह आपको वापस करने के लिए वापस आ जाएगा। मानक सी ++ के साथ एक अच्छा प्रतिस्थापन std :: istringstream है। – Tom

0

आप को बढ़ावा देने पुस्तकालयों का उपयोग कर सकते हैं, मैं उपयोग करने के लिए सुझाव है कि boost::tokenizer:

बढ़ावा Tokenizer पैकेज एक में एक स्ट्रिंग या अन्य चरित्र के तोड़ने के लिए एक लचीला और उपयोग करने के लिए आसान तरीका अनुक्रम प्रदान करता है टोकन की श्रृंखला। नीचे एक साधारण उदाहरण है जो शब्दों में एक वाक्यांश को तोड़ देगा।

// simple_example_1.cpp 
#include<iostream> 
#include<boost/tokenizer.hpp> 
#include<string> 

int main(){ 
    using namespace std; 
    using namespace boost; 
    string s = "This is, a test"; 
    tokenizer<> tok(s); 
    for(tokenizer<>::iterator beg=tok.begin();beg!=tok.end();++beg){ 
     cout << *beg << "\n"; 
    } 
} 
3

मैं इस संकलन प्रयास नहीं किया है, लेकिन यहाँ एक विकल्प है कि बूस्ट का उपयोग कर के रूप में लगभग के रूप में सरल है, लेकिन अतिरिक्त निर्भरता के बिना।

#include <iostream> 
#include <sstream> 
#include <string> 

int main() { 
    std::string line; 
    while (std::getline(std::cin, line)) { 
    std::istringstream linestream(line); 
    std::string word; 
    while (linestream >> word) { 
     std::cout << word << "\n"; 
    } 
    } 
    return 0; 
} 
+0

+1 इस तरह मैं इसे करूँगा। अब काउंटर डालें और यह हो गया है। – Frank

0
ifstream is {"my_file_path"}; 
vector<string> b {istream_iterator<string>{is},istream_iterator<string>{}}; 

न इस शामिल करने के लिए भूल जाते हैं:

<iterator> 
संबंधित मुद्दे

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