[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번과 비슷하다.

std::string::size_type dot = filename.find_last_of('.') + 1;
std::string ext = filename.substr(dot, filename.length() - dot);

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

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

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

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

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

3.순수 파일(확장자 없는) 이름 알아오기
std::string GetPureNameOfFile(std::string filename) {
	std::string::size_type slash = filename.find_last_of("/\\");
	std::string::size_type dot = filename.find_last_of(".");
	if (dot == std::string::npos) {
		dot = filename.length();
	}
	std::string pure = filename.substr(slash+1, dot - slash-1);
	return pure;
}
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 와 비슷하게 사용할 수 있다.

  • 틈틈히 작성하자!