2010-10-27 39 views
14

Tôi đang viết chương trình để phân tích một số dữ liệu được lưu dưới dạng tệp văn bản. Những gì tôi đang cố gắng làm là tìm vị trí của mỗi kim trong một đống cỏ khô. Tôi đã có thể đọc các tập tin trong và xác định số lần xuất hiện, nhưng tôi cũng đang tìm kiếm chỉ mục.Tìm tất cả các địa điểm và địa điểm của chuỗi con

+1

Thông tin chi tiết xin vui lòng. Một mẫu mã sẽ rất hữu ích để hiểu những gì bạn đang cố gắng làm. –

+0

nếu không mã, sau đó đầu ra mong muốn cho một đầu vào mẫu nhỏ –

Trả lời

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

Sửa tôi không nhận định bài viết của bạn, bạn nói xâu, và tôi cho rằng bạn có nghĩa là bạn đang tìm kiếm một chuỗi. Điều này sẽ vẫn hoạt động nếu bạn đọc tệp thành chuỗi.

+0

= nếu tệp dài 100 GB thì sao? Điều đó vẫn còn hiệu quả? –

+0

Tệp không dài. Điều này sẽ làm việc hoàn hảo :) cảm ơn! –

+0

@Steve - Nếu anh ta có thể đọc tệp 100GB thành chuỗi như tôi đã nói, thì có, nó sẽ hoạt động. –

4

Tôi biết một câu trả lời đã được chấp nhận, nhưng điều này cũng sẽ làm việc, và sẽ giúp bạn tiết kiệm phải tải trong tập tin vào một chuỗi ..

#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 
    } 
    } 
} 
Các vấn đề liên quan