2010-10-27 3 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

= что, если файл имеет длину 100 ГБ? Это еще работает? –

+0

Файл не очень длинный. Это должно работать отлично :) спасибо! –

+0

@Steve - Если он умеет читать 100GB-файл в строку, как я уже сказал, тогда да, это сработает. –

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 
    } 
    } 
} 
Смежные вопросы