2014-12-12 9 views
1

문장이 포함 된 문자열이 있습니다. 그 문자열에서 특정 단어를 검색하고 바꿔야합니다. 필자의 경우에는 선의 벡터와 대체 할 단어의 벡터가 있습니다.공백을 건너 뛰지 않고 문자열의 단어 바꾸기

void Generator::generate_file(const string& fileName){ 
    string inBuffer, outBuffer; 
    std::stringstream ss; 
    std::ofstream outFile; 
    outFile.open(fileName); 
    for (const auto& inIT : userCode){ 
     //userCode is a vector which contains lines of text 
     ss.str(inIT); 
     ss.clear(); 
     outBuffer = ""; 
     while (ss >> inBuffer){ 
      for (auto keyIT : keywords){ 
       //keywords is a vector which contains words to replace 
       if (keyIT == inBuffer) 
        inBuffer = "REPLACED"; 
      } 
      outBuffer += inBuffer + " "; 
     } 
     outFile << outBuffer << endl; 
    } 
    outFile.close(); 
} 

이 기능의 문제가 모든 공백을 건너 뛰고 있다는 것입니다 : 다음은 마지막 텍스트 파일을 생성 내 기능입니다. 출력 파일에 필요합니다. 그것을 성취하기 위해 무엇을해야합니까? 그것은 다음과 같습니다 내 기능을 실행 한 후

class UrlEncoder(object): 
    def __init__(self, alphabet=DEFAULT_ALPHABET, block_size=DEFAULT_BLOCK_SIZE): 

다음 userCode 벡터를 표시

userCode[0] = "class UrlEncoder(object): class"; 
userCode[1] = " def __init__(self, alphabet=DEFAULT_ALPHABET,\n block_size=DEFAULT_BLOCK_SIZE):"; 

:

userCode : 아래에서 어떻게 작동하는지의 예를 볼 수 있습니다 :

REPLACED UrlEncoder(object): 
REPLACED __init__(self, alphabet=DEFAULT_ALPHABET, block_size=DEFAULT_BLOCK_SIZE): 

잘 보시다시피 키워드를 바꿀 수 있습니다. 그러나 불행히도 그것은 tabulator를 건너 뛰었습니다.

+0

당신이 무슨 뜻 이죠, "모든 공백을 건너을?" –

+0

@j_random_hacker 내 질문을 편집하고 예제를 추가했습니다. 지금은 더 분명해지기를 바랍니다. –

답변

1

가장 큰 문제는 스트림 추출 >> 연산자 작동 방식입니다. 다음 형식화 된 입력을 읽을 때 선행 공백 문자를 제거하고 버립니다. 입력을 잡을 때 ss >> inBuffer을 계속 사용한다고 가정하면 입력 추출을 수행하기 전에 선행 공백을 잡을 수있는 방법을 찾아야합니다. 예를 들어

,

이제
string eatwhite(const string &str, size_t pos) 
{ 
    size_t endwhite = str.find_first_not_of(" \t\n", pos); 
    if (endwhite == string::npos) return ""; 
    return string(str.begin() + pos, str.begin() + endwhite); 
} 

당신이 어떤 >>하기 전에 eatwhite를 부를 것이다 :

string outBuffer = eatwhite(ss.str(), ss.tellg()); 
    while (ss >> inBuffer) 
    { 
     for (auto keyIT : keywords) 
     { 
      //... 
     } 
     string whitesp = eatwhite(ss.str(), ss.tellg()); 
     outBuffer += inBuffer + whitesp; 
    } 
    outFile << outBuffer << endl; 
+0

정말 고마워요. 당신은 그날을 구했습니다. –

관련 문제