2010-10-27 10 views
14

मैं टेक्स्ट फ़ाइलों के रूप में सहेजे गए कुछ डेटा को पार्स करने के लिए एक प्रोग्राम लिख रहा हूं। मैं जो करने की कोशिश कर रहा हूं उसे एक घास के मैदान में हर सुई का स्थान मिल रहा है। मैं पहले से ही फाइल को पढ़ सकता हूं और घटनाओं की संख्या निर्धारित कर सकता हूं, लेकिन मैं इंडेक्स को भी ढूंढ रहा हूं।सभी सबस्ट्रिंग की घटनाओं और स्थानों को खोजें

+1

अधिक जानकारी के लिए कृपया। आप जो करने की कोशिश कर रहे हैं उसे समझने के लिए एक कोड नमूना बहुत उपयोगी होगा। –

+0

यदि कोड नहीं है, तो छोटे नमूना इनपुट –

उत्तर

18
string str,sub; // str is string to search, sub is the substring to search for 

vector<size_t> positions; // holds all the positions that sub occurs within str 

size_t pos = str.find(sub, 0); 
while(pos != string::npos) 
{ 
    positions.push_back(pos); 
    pos = str.find(sub,pos+1); 
} 

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

+0

= के लिए वांछित आउटपुट = यदि फ़ाइल 100GB लंबी है तो क्या होगा? क्या यह अभी भी काम करता है? –

+0

फ़ाइल बहुत लंबी नहीं है। यह सही काम करना चाहिए :) धन्यवाद! –

+0

@Steve - यदि वह 100 जीबी फ़ाइल को एक स्ट्रिंग में पढ़ने में सक्षम है जैसे मैंने कहा, तो हाँ, यह काम करेगा। –

4

मैं जानता हूँ कि एक जवाब स्वीकार किया गया है, लेकिन यह भी काम करेंगे, और आप एक स्ट्रिंग के लिए फ़ाइल में लोड करने के लिए होने की बचत होगी ..

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

int main(void) 
{ 
    const char foo[] = "foo"; 
    const size_t s_len = sizeof(foo) - 1; // ignore \0 
    char block[s_len] = {0}; 

    ifstream f_in(<some file>); 

    vector<size_t> f_pos; 

    while(f_in.good()) 
    { 
    fill(block, block + s_len, 0); // pedantic I guess.. 
    size_t cpos = f_in.tellg(); 
    // Get block by block.. 
    f_in.read(block, s_len); 
    if (equal(block, block + s_len, foo)) 
    { 
     f_pos.push_back(cpos); 
    } 
    else 
    { 
     f_in.seekg(cpos + 1); // rewind 
    } 
    } 
} 
संबंधित मुद्दे