종종 우리는 어떤 파일이 어떤 디렉토리에 존재 하는지 알 필요가 있다.
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());
_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바이트 부호없는 정수이다.
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;
}
char r='\t';
str.erase(std::remove(str.begin(), str.end(), r), str.end());
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)
으로 사용이 가능하다.
int n=7;
std::ostringstream oss;
oss.width(4); //출력폭을 어떻게 할 것인지?
oss.fill('0'); //남는폭을 무엇으로 채울 것인지?
oss << n;
0007
std::ostream::width
와 std::ostream::fill
은 일회성 함수이다.
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;
}
간단하게 허용 확장자 리스트에서 각 확장자를 ;
를 기준으로 잘라내는 과정이다.
string s;
transform (s.begin(), s.end(), s.begin(), tolower);
transform (s.begin(), s.end(), s.begin(), toupper);
3번째 인수는 목적지로써 std::copy
와 비슷하게 사용할 수 있다.
std::string s = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\t\n";
std::string m = s.substr(0, s.find_last_not_of("\n\t ")+1);
find_last_not_of
가 std::string::npos
를 반환하더라고 npos에 1을 더하면 size_t 오버플로우가 나서 0이 된다. 그런데 find_last_not_of
가 npos가 나온다는것은 모두 white space임을 뜻하므로 모든 스트링을 지워야 한다. 그러므로 호출되는 s.substr(0,0)
은 올바른 동작이므로 위 코드는 예외처리가 필요없다.
std::string text_msg = "hello\\nworld\\nspring";
std::string from = "\\n";
std::string to = "\n";
while(text_msg.find(from)!=text_msg.npos)
text_msg.replace(text_msg.find(from), from.length(), to);
std::cout << text_msg << std::endl;
가장 깔끔하게 함수를 따로 만들지 않고 내부 문자열을 다른 문자열로 교체할 수 있다.