소감 ¶
음 만약에 한글과 같은 확장문자가 담겼다면 process_wchar() 함수에서 약간의 꼼수를 부린다. 가상의 예(실제로 이렇게 되지는 않지만, 원리는 같음)를 들어보자. "가나" 라는 문자열을 ver1과 같은 통상의 프로그램으로 뒤집으면 "나가"와 같이 프로그래머가 원했던 결과가 나오는 것이 아니고 "ㅏㄴㅏㄱ"가 나온다. 그렇다면 확장문자를 판단해서 문자열을 뒤집기 전에 "가나"라는 문자열을 "ㅏㄱㅏㄴ" 이렇게 만들어 놓는다면 기존 ver1의 프로세스를 전혀 바꾸지 않고도, process_wchar()만을 추가하는 것으로 원했던 기능을 모두 수행하게 된다.
코드 ¶
ver1 (확장 문자 지원 안함) ¶
~cpp #include <fstream> #include <algorithm> #include <string> using namespace std; string read_file(); void write_file(const string & str); void main() { string str = read_file(); reverse(str.begin(), str.end()); // 문자열을 거꾸로 해주는 STL 함수 write_file(str); } // 파일로부터 문자열을 읽어들인다. string read_file() { string str; fstream fin("source.txt"); char ch = fin.get(); while (ch != EOF) { str += ch; ch = fin.get(); } return str; } // 파일에 문자열을 쓴다. void write_file(const string & str) { fstream fout("result.txt"); fout << str; }
ver2 (확장문자까지 판단해서 반대로 한다) ¶
~cpp #include <fstream> #include <algorithm> #include <string> using namespace std; string read_file(); void write_file(const string & str); void process_wchar(string & str); void main() { string str = read_file(); process_wchar(str); reverse(str.begin(), str.end()); // 문자열을 거꾸로 해주는 STL 함수 write_file(str); } // 확장문자를 위한 전처리 함수 void process_wchar(string & str) { // str[i]는 char. 하지만 이것이 확장문자의 일부라면 음수가 담기게 된다. for (int i = 0; i < str.length(); i++) { if (str[i] < 0 && str[i + 1] < 0) { swap(str[i], str[i+1]); i++; } } } // 파일로부터 문자열을 읽어들인다. string read_file() { string str; fstream fin("source.txt"); char ch = fin.get(); while (ch != EOF) { str += ch; ch = fin.get(); } return str; } // 파일에 문자열을 쓴다. void write_file(const string & str) { fstream fout("result.txt"); fout << str; }