2010-10-27 29 views
14

Metin dosyaları olarak kaydedilmiş bazı verileri ayrıştırmak için bir program yazıyorum. Yapmaya çalıştığım şey, samanlıkta her iğnenin yerini bulmak. Dosyayı zaten okuyabilirim ve olay sayısını belirleyebilirim, ancak indeksi de bulmak istiyorum. Ben yazınızı yanlış yorumlamakTüm bir alt dizenin oluşumları ve konumlarını bul

+1

Daha fazla detay lütfen .. Eğer bir dizeye dosyaya yüklenmek zorunda kurtaracak. Bir kod örneği, yapmaya çalıştığınız şeyi anlamak için çok yardımcı olacaktır. –

+0

kod değilse, daha küçük bir örnek giriş için çıktı –

cevap

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); 
} 

Düzenleme , sen alt dize söyledi, ben size bir dize arama yapıyor anlamına geliyordu üstlendi. Dosyayı bir dizgeye okursanız, bu yine de çalışır.

+0

= dosya 100GB uzunsa ne olur? Bu hala çalışıyor mu? –

+0

Dosya çok uzun değil. Bu mükemmel çalışmalı :) teşekkürler! –

+0

@Steve - Eğer 100GB dosyasını dediğim gibi bir dizeye okuyabiliyorsa, o zaman işe yarayacaktır. –

4

Ben bir cevap kabul edildi biliyorum, ama bu aynı zamanda çalışacak ve

#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 
    } 
    } 
} 
İlgili konular