2010-10-27 5 views
14

J'écris un programme pour analyser certaines données enregistrées en tant que fichiers texte. Ce que j'essaie de faire est de trouver l'emplacement de chaque aiguille dans une botte de foin. Je peux déjà lire le fichier et déterminer le nombre d'occurrences, mais je cherche aussi l'index.Trouver toutes les occurrences et les emplacements d'une sous-chaîne

+1

plus de détails. Un exemple de code serait très utile pour comprendre ce que vous essayez de faire. –

+0

si ce n'est pas du code, alors la sortie désirée pour un petit échantillon d'entrée –

Répondre

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

Modifier J'ai mal lu votre message, vous avez dit sous-chaîne, et je suppose que vous vouliez dire que vous recherchez une chaîne. Cela fonctionnera toujours si vous lisez le fichier dans une chaîne.

+0

= et si le fichier fait 100Go de long? Est-ce que ça fonctionne encore? –

+0

Le fichier n'est pas très long. Cela devrait fonctionner parfaitement :) merci! –

+0

@Steve - S'il est capable de lire le fichier de 100 Go dans une chaîne comme je l'ai dit, alors oui, cela fonctionnera. –

4

Je sais une réponse a été acceptée, mais cela aussi travailler, et vous évitera d'avoir à charger dans le fichier à une chaîne ..

#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 
    } 
    } 
} 
Questions connexes