2010-06-21 6 views
5

아래 프로그램에서 파일의 각 줄을 문자열로 읽고 문자열을 분석하여 개별 단어를 표시하려고합니다. 문제는 프로그램 이제 파일의 첫 번째 행만 출력합니다. 왜 이런 일이 일어나는지 이해가 안되니?프로그램에서 getline과 strtok를 함께 사용할 때의 문제

#include<iostream> 
#include<string> 
#include<fstream> 
#include<cstdio> 
using namespace std; 

int main() 
{ 
    ifstream InputFile("hello.txt") ; 
    string store ; 
    char * token; 

    while(getline(InputFile,store)) 
    { 
     cout<<as<<endl; 
     token = strtok(&store[0]," "); 
     cout<<token; 
     while(token!=NULL) 
     { 
     token = strtok(NULL," "); 
     cout<<token<<" "; 
     } 

    } 

} 

답변

3

나 C++에 새로운 해요,하지만 난 다른 방법이 될 수 있다고 생각 :

while(getline(InputFile, store)) 
{ 
    stringstream line(store); // include <sstream> 
    string token;   

    while (line >> token) 
    { 
     cout << "Token: " << token << endl; 
    } 
} 

이렇게하면 파일을 한 줄씩 구문 분석하고 공백 구분에 따라 각 줄을 토큰 화합니다. 탭과 같은 새로운 공백).

+0

동의 : OP의 실제 사용 사례가 질문 (공백으로 분리)에서 제시된 것처럼 단순하다면 문자열 스트림은 매우 좋은 아이디어입니다. –

2

글쎄, 여기에는 문제가 있습니다. strtok()은 Null로 끝나는 문자열을 사용하고 std::string의 내용은 반드시 Null로 끝나는 것은 아닙니다.

std::string에서 Null 종료 문자열을 얻을 수는 있지만 c_str()을 호출하면 const char* (즉, 문자열을 수정할 수 없음)을 반환합니다. strtok()char*이고 호출 될 때 문자열을 수정합니다. 이제 사용할 수 있습니다

std::string s("hello, world"); 
std::vector<char> v(s.begin(), s.end()); 
v.push_back('\0'); 

: 당신이 정말로 strtok()를 사용하려면

, 다음 내 의견으로는 가장 깨끗한 옵션은 std::vector와 널 종료 벡터에 std::string에서 문자를 복사하는 것입니다 벡터의 내용을 null로 끝나는 문자열 (&v[0] 사용)로 변환하고 strtok()으로 전달합니다.

부스트를 사용할 수 있다면 Boost Tokenizer을 사용하는 것이 좋습니다. 문자열을 토큰 화하는 데 매우 깨끗한 인터페이스를 제공합니다.

+1

이유는 무엇입니까 downvote; 난 벡터 연속성을 사용하여 줄 알았는데. – dreamlax

+1

아마 30.8k의 포인트와 3 개의 금색 별, 75 개의 은화와 모든 청동이 있고 당신이 downvote를 사용할 수 있다고 생각했기 때문일 것입니다. – sashang

0

James McNellis가 말하는 것은 정확합니다. 빠른 솔루션을

(안 최고의하지만), 대신

string store 

사용

const int MAX_SIZE_LINE = 1024; //or whatever value you consider safest in your context. 
char store[MAX_SIZE_LINE]; 
관련 문제