[M1 Mac, Big Sur 11.6.8, FLTK 1.3.8, NO IDE]
前回記事で文字列のスペースを削除して新たなファイル名を作成しましたが、より読みやすくするため区切り文字をアンダースコアなどに変更できるようライブラリにsplitJoin2関数を追加しました。
#pragma once
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <vector>
#include <cstdio>
#include <sstream>
#include <iostream>
using std::string; using std::vector;
using std::cout; using std::endl;
class Split{
public:
vector<string> splits(string str, const char* del);
string splitJoin(string str, const char* del, int start, int end);
string splitJoin2(string str, const char* del1, const char* del2, int start, int end);
int chCWD(string str, const char* del, int start, int end);
};
#include "Split.h"
using std::string; using std::vector;
using std::cout; using std::endl;
// 文字列を文字列delで分割しリスト化する関数
vector<string> Split::splits(string str, const char* del) {
int first = 0;
int last = str.find_first_of(del);
vector<string> result;
while (first < str.size()) {
string subStr(str, first, last - first);
result.push_back(subStr);
first = last + 1;
last = str.find_first_of(del, first);
if (last == string::npos) {
last = str.size();
}
}
return result;
}
// 分割リストのstart番目からend番目までの要素を同じ区切り文字で再結合する関数(startの最小値は0)
string Split::splitJoin(string str, const char* del, int start, int end){
string result2;
if (str.find(del) == std::string::npos){
cout << "区切り文字が含まれていません" << endl;
return str;
}
vector<string> list = Split::splits(str, del);
vector<string> list2;
for (int i = 0; i < list.size(); i++){
if (end < 0){
end += list.size();
}
if (i >= start && i <= end) {
list2.push_back(list[i]);
}
}
for (int i = 0; i< list2.size(); i++){
result2.append(list[i] + del);
}
return result2;
}
// 分割リストの全要素を異なる区切り文字で再結合する関数
string Split::splitJoin2(string str, const char* del1, const char* del2){
string result3;
if (str.find(del1) == std::string::npos){
cout << "区切り文字が含まれていません" << endl;
return str;
}
vector<string> list = Split::splits(str, del1);
// リストの要素を区切り文字del2で結合
const char* delim = del2;
std::ostringstream os;
std::copy(list.begin(), list.end(), std::ostream_iterator<string>(os, delim));
result3 = os.str();
return result3;
}
// 作業ディレクトリを変更(階層を上げる)
int Split::chCWD(string str, const char* del, int start, int end){
string new_str = Split::splitJoin(str, del, start, end);
int rtn = chdir(new_str.c_str());
return rtn;
}