Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- using namespace std;
- ////////////////////////////////////////////////////////////////////////
- // Типы path
- // 1) /homework/skyrim.exe - относительный путь | до файла
- // 2) C:/abc/homework/skyrim.exe - абсолютный путь | до файла
- // 3) /homework/ - относительный путь | до католога
- // 4) C:/abc/ - абсолютный путь | до католога
- // ДОПУСТИМЫЕ символы
- // 1) Буквы
- // 2) Цифры
- // 3) Символы: ~ @ # $ % ^ - _ ( ) { } ' ` .
- ////////////////////////////////////////////////////////////////////////
- bool itCoorectPath(const string path) {
- bool absolute = false;
- bool coorect = true;
- bool file = false;
- // Проверка на абсолютность путя
- if ( (path.size() > 2) & (path[0] >= 'A') & ('Z' >= path[0]) & (path[1] == ':') ) {
- absolute = true;
- }
- unsigned int i; if (absolute) { i = 2; } else { i = 0; }
- while (path.size() > i) {
- char ch = path[i];
- // Проверка на допустимые символы (парсинг 2000лвл)
- if ( ((ch >= 'A') & (ch <= 'Z')) |
- ((ch >= 'a') & (ch <= 'z')) |
- ((ch >= '.') & (ch <= '9')) |
- ((ch >= '#') & (ch <= '%')) |
- ((ch >= '\'') & (ch <= ')')) |
- (ch == '{') | (ch == '}') |
- (ch == '~') | (ch == '@') |
- (ch == '^') | (ch == '-') |
- (ch == '_') | (ch == '`') )
- {
- // Проверка на корректность окончания пути файла
- if ( (path.size() + 1 == i) & (file) & (path[i] != '.') ) {
- coorect = false; break;
- }
- // Проверка на название файла
- if ( path[i] == '.' ) {
- file = true;
- }
- // Проверка на корректность окончания пути каталога
- if ( (path.size() - 1 == i) & (!file) & (path[i] != '/') ) {
- coorect = false; break;
- }
- // Проверка на корректность окончания пути файла
- if ( (path.size() - 1 == i) & (file) & (path[i] == '.') ) {
- coorect = false; break;
- }
- // Проверка на корректность слэша
- if ( (path[i] == '/') & (i != 0) ) {
- if (file) {
- coorect = false; break;
- }
- if (path[i - 1] == '/') {
- coorect = false; break;
- }
- }
- // CЮДА МОЖНО ДОБАВИТЬ НУЖНЫЕ ПРОВЕРКИ
- // CЮДА МОЖНО ДОБАВИТЬ НУЖНЫЕ ПРОВЕРКИ
- // CЮДА МОЖНО ДОБАВИТЬ НУЖНЫЕ ПРОВЕРКИ
- }
- // Если символ не допустим
- else { coorect = false; break; }
- // Итерация
- i++;
- }
- // cout-отладка
- // cout << "Path: " << path << endl
- // << "coorect = " << coorect << endl
- // << "absolute = " << absolute << endl
- // << "file = " << file << endl
- // << endl;
- return coorect;
- }
- ////////////////////////////////////////////////////////////////////////
- void catalog_or_path(const string path) {
- if (itCoorectPath(path)) {
- if (find(path.begin(), path.end(), '.') != path.end()) {
- cout << "Its path file" << endl;
- } else {
- cout << "Its path catalog" << endl;
- }
- }
- else {
- cout << "Path dont coorect" << endl;
- }
- }
- ////////////////////////////////////////////////////////////////////////
- string return_name_file(const string path) {
- if (itCoorectPath(path)) {
- if (find(path.begin(), path.end(), '.') == path.end()) {
- cout << "Its path catalog" << endl;
- return string("");
- } else {
- return string( find(path.rbegin(), path.rend(), '/').base() , path.end() );
- }
- }
- else {
- cout << "Path dont coorect" << endl;
- return string("");
- }
- }
- ////////////////////////////////////////////////////////////////////////
- string sumPath(const string& path_left, const string& path_right) {
- // Возможно суммирование
- // 1. Если оба path корректны
- // 2. Правый path - относительный
- // 3. Левый path - не файл
- // Первая проверка
- if (!(itCoorectPath(path_left) & itCoorectPath(path_right))) {
- return string("error path");
- }
- // Вторая проверка
- if (((path_right.size() > 2) & (path_right[0] >= 'A')
- & ('Z' >= path_right[0]) & (path_right[1] == ':'))) {
- return string("error path");
- }
- // Третья проверка
- if (find(path_left.begin(), path_left.end(), '.') != path_left.end()) {
- return string("error path");
- }
- return string(path_left.begin(), path_left.end() - 1) + path_right;
- }
- ////////////////////////////////////////////////////////////////////////
- string pick(const string path, const unsigned int index) {
- // Проверка на корректность
- if (!itCoorectPath(path)) { return string(); }
- auto iter_left = path.begin();
- unsigned int k = 1;
- while ((k++ != index) & (iter_left != path.end())) {
- iter_left = find(iter_left, path.end(), '/');
- iter_left++;
- }
- return string(iter_left, find(iter_left, path.end(), '/'));
- }
- ////////////////////////////////////////////////////////////////////////
- int main() {
- string test1("/homework/skyrim.exe");
- string test2("C:/abc/homework/skyrim.exe/");
- string test3("/homework/L()L");
- string test4("/homework/skyrim.exe");
- cout << "Name file test1: " << return_name_file(test1) << endl;
- cout << "Coorect test1: " << itCoorectPath(test1) << endl;
- cout << "test1 "; catalog_or_path(test1); cout << endl;
- cout << "Coorect test2: " << itCoorectPath(test2) << endl;
- cout << "Coorect test3: " << itCoorectPath(test3) << endl;
- cout << "Name file test4: " << return_name_file(test4) << endl;
- cout << endl;
- string testLeft("C:/Desktop/");
- string testRight("/labs/Adobe_PS.exe");
- string newPath = sumPath(testLeft, testRight);
- cout << "Name file newPath: " << return_name_file(newPath) << endl;
- cout << "Coorect newPath: " << itCoorectPath(newPath) << endl;
- cout << "newPath "; catalog_or_path(newPath);
- cout << "newPath[2]: " << pick(newPath, 2) << endl;
- cout << "newPath[3]: " << pick(newPath, 3) << endl;
- cout << "newPath[4]: " << pick(newPath, 4) << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement