2010-10-27 33 views
14

Estoy escribiendo un programa para analizar algunos datos guardados como archivos de texto. Lo que trato de hacer es encontrar la ubicación de cada aguja en un pajar. Ya puedo leer el archivo y determinar el número de apariciones, pero también estoy buscando el índice.Buscar todas las ocurrencias y ubicaciones de una subcadena

+1

Más detalles por favor. Una muestra de código sería muy útil para comprender lo que estás tratando de hacer. –

+0

si no es el código, entonces la salida deseada para una entrada de muestra pequeña –

Respuesta

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

Editar leí mal el mensaje, dijo subcadena, y supuse que significaba que estaban buscando una cadena. Esto seguirá funcionando si lees el archivo en una cadena.

+0

= ¿qué ocurre si el archivo tiene 100 GB de longitud? ¿Eso todavía funciona? –

+0

El archivo no es muy largo. Esto debería funcionar perfecto :) ¡Gracias! –

+0

@Steve - Si puede leer el archivo de 100GB en una cadena como dije, entonces sí, funcionará. –

4

sé la respuesta ha sido aceptada, pero esto también va a funcionar, y se ahorrará tener que cargar en el archivo de una cadena ..

#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 
    } 
    } 
} 
Cuestiones relacionadas