2015-02-05 5 views
1

간단한 반전 된 색인을 만들고 싶습니다. 각 문서에있는 docId와 키워드가있는 파일이 있습니다. 첫 번째 단계는 파일을 읽고 텍스트 파일을 토큰 화하는 것입니다. 온라인으로 작동하는 tokenize 함수를 발견하고 조금 변경했습니다. 나는 공백 뒤에 각 단어를 토큰 화하고 싶다. 내 텍스트 파일에는 쉼표 나 마침표가 없습니다. 텍스트 파일을 토큰 화 한 후 토큰은 벡터에 저장됩니다. 그래서 tokenize 함수를 실행 한 후에 벡터 요소를 인쇄 해 보았습니다.하지만 아무 일도 일어나지 않았습니다. 그런 다음 벡터의 크기를 인쇄 해 보았습니다. 그 결과 0이되었습니다. 여기 내 코드입니다 :내 벡터가 비어있는 이유는 무엇입니까?

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 
#include "functions.h" 
#include "vector" 

using namespace std; 

int main() 
{ 
    string line; 
    vector<string> v; 
    ifstream myfile("test.txt"); 


    if(myfile.is_open()){ 
     while(getline(myfile,line)){ 
      //cout << line << '\n'; 
      tokenize(line, ' ', v); 
     } 

     myfile.close(); 
    } 
    else cout << "Unable to open file"; 

    cout << v.size() << '\n'; 

    return 0; 
} 

여기 내 토큰 화 기능입니다 : 내가 프로그램에서 나중에 스레드를 사용하기 때문에

using namespace std; 

void tokenize(string s, char c, vector<string> v) { 
    string::size_type i = 0; 
    string::size_type j = s.find(c); 

    while (j != string::npos) { 
     v.push_back(s.substr(i, j-i)); 
     i = ++j; 
     j = s.find(c, j); 

     if (j == string::npos) 
     v.push_back(s.substr(i, s.length())); 
    } 
} 

내가 strtok을 사용할 수 없습니다 나는 포럼에서 읽은 그 strtok은 스레드와 잘 작동하지 않습니다.

+1

하면은'무효 토큰 화 (문자열의, 숯불 C, 벡터 없을 겁니다 & v)'? – vaultah

+1

값으로 벡터를 전달합니다. – drescherjm

+0

호출 함수에서 결과를 확인하려면 벡터를 참조로 전달해야합니다. BTW :'#include "vector"대신 #include '을 만드십시오. –

답변

4

내 벡터가 비어있는 이유는 무엇입니까?

당신이 값으로 vector을 통과하기 때문에 :

void tokenize(string s, char c, vector<string> v) { 

변경을 참조로 :

void tokenize(string s, char c, vector<string>& v) { 
+0

아, 고맙습니다. 첫 번째 줄은 아닙니다. 토큰 화되지 않습니다. 첫 번째 줄은 문서 번호입니다. 온라인에서 찾은 함수도'string s' 대신'string & s'을 사용했습니다. 차이가 있습니까? – captain

+0

예. 'string s'를 사용하면 입력 문자열의 사본을 만듭니다. 'string & s'를 사용하면 원래 문자열에 대한 참조를 사용합니다. 'tokenize'에 의해 수정 된 원래의 문자열에 신경 쓸 필요가 없다면, 참조를 사용하는 것이 더 효율적입니다. –

관련 문제