[C++] std::string

1. 문자열의 뒤에서 부터 검색

종종 우리는 어떤 파일이 어떤 디렉토리에 존재 하는지 알 필요가 있다. string::substr 함수를 통해 0번째부터 마지막에 나오는 '/' 까지 자르면 된다.

마지막에 나오는 '/' 의 위치를 알기 위해 뒤에서 부터 검색하는

string::find_last_of 라는 메소드가 존재한다.

/\ 둘다 찾아준다.

string str = "C:/Users/kimbom/Desktop/태깅연습/103827_4_연미지128.jpg";  
//C:/Users/kimbom/Desktop/태깅연습
string path = str.substr(0, str.find_last_of("/\\"));  
//103827_4_연미지128.jpg
string file = str.substr(str.find_last_of("/\\")+1,str.length());  
2. 확장자 추출

_splitpath 라는 함수가 있지만, C언어 용이라 인수들이 전부 char* 이다.

std::string 을 이용한 고급진 기법이 있다. 앞서 말한 1번과 비슷하다.

string ext=str.substr(str.find_last_of('.')+1, str.length());  

'.' 의 위치+1 부터 끝까지 찾으면 된다.

만일 확장자가 없으면? string::find_last_of 메소드는 실패시 string::npos를 반환하는데

이 값의 자료형은 size_t 이고 해당 자료형에서 가장 큰 값을 리턴한다.

그 값에서 1을 더했으므로 첫번째 인수는 0이되고, 즉 확장자가 없을경우에는 원본 문자열이 그대로 나오는 것이다.

참고로 x86 머신에서 size_t 는 4바이트 부호없는 정수, x64 머신에서는 8바이트 부호없는 정수이다.

3.파일 이름 알아오기
std::string str = "W:\\workspace\\RotationTaggingTool\\x86\\Debug/a.ini";  
std::string dst = str.substr(str.find_last_of("\\/")+1, str.length());  

std::string::substr 의 2번째 인수는 해당 지점부터의 길이 이지만 끝까지 추출할것이므로 length 를 사용한다.

4.특정 문자 제거
char r='\t';  
str.erase(std::remove(str.begin(), str.end(), r), str.end());  
5.파일 통채로 읽기
std::ifstream fin;  
fin.open(path, std::ios::in);

std::string str;  
str.assign(std::istreambuf_iterator<char>(fin),std::istreambuf_iterator<char>());  

물론 assign메소드 대신 std::string::(constructor) 으로 사용이 가능하다.

6.자리수 지정 숫자
int n=7;  
std::ostringstream oss;  
oss.width(4);    //출력폭을 어떻게 할 것인지?  
oss.fill('0');   //남는폭을 무엇으로 채울 것인지?  
oss << n;  
0007  

std::ostream::widthstd::ostream::fill은 일회성 함수이다.

7.string tokenizer
std::string basic_str = "*.cpp;*.h;*.c;*.jpg;";  
std::string token = ";";  
std::vector<std::string> word_list;  
std::string::size_type offset = 0;  
while (offset<basic_str.length()){  
    std::string str = basic_str.substr(offset, basic_str.find(token, offset) - offset);
    word_list.push_back(str);
    offset += str.length() + 1;
}

간단하게 허용 확장자 리스트에서 각 확장자를 ;를 기준으로 잘라내는 과정이다.

8. 대소문자 변환
string s;  
transform (s.begin(), s.end(),  s.begin(), tolower);  
transform (s.begin(), s.end(), s.begin(), toupper);  

3번째 인수는 목적지로써 std::copy 와 비슷하게 사용할 수 있다.
* 틈틈히 작성하자!