daily pastebin goal
24%
SHARE
TWEET

CW

Lixard Mar 24th, 2019 (edited) 69 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <string>
  3. #include <Windows.h>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <iterator>
  7. #include <sstream>
  8. #include <fstream>
  9.  
  10.  
  11. using namespace std;
  12.  
  13. int main()
  14. {
  15.     SetConsoleCP(1251);
  16.     SetConsoleOutputCP(1251);
  17.     string input;
  18.     int key = 10;
  19.     vector<string> commands = { "mkdir","comm","diff","sort","uniq","wc","cd","e" };
  20.     vector<string> v_input;
  21.     SetCurrentDirectory("C://");
  22.     cout << "user:~# ";
  23.     while (getline(cin, input) && input != "quit")
  24.     {
  25.         if (input.empty())
  26.         {
  27.             input.push_back('e');
  28.         }
  29.         istringstream is(input);        //превращаем строку в поток
  30.         copy(istream_iterator<string>(is), istream_iterator<string>(), back_inserter(v_input)); //читаем по словам и добавляем в вектор
  31.         for (int i = 0; i < commands.size(); i++)
  32.         {
  33.             if (v_input[0] == commands[i])
  34.             {
  35.                 key = i;
  36.             }
  37.         }
  38.         switch (key)
  39.         {
  40.         case 0: // mkdir // В линуксе разделителем папок является '/' 
  41.         {
  42.             v_input.erase(v_input.begin());
  43.             for (int i = 0; i < v_input.size(); i++)
  44.             {
  45.                 if (!v_input[i].find('-'))
  46.                 {
  47.                     v_input.erase(v_input.begin() + i);
  48.                     i--;
  49.                 }
  50.             }
  51.             if (v_input.empty()) // при вводе только команды
  52.             {
  53.                 cout << "mkdir: пропущен операнд" << endl;
  54.                 cout << "По команде «mkdir --help» можно получить дополнительную информацию." << endl;
  55.             }
  56.             for (int i = 0; i < v_input.size(); i++)
  57.             {
  58.                 string clearinput = v_input[0];
  59.                 v_input[i].erase(remove(v_input[i].begin(), v_input[i].end(), '\\'), v_input[i].end()); //убираем даунские палки
  60.                 const char *folder = v_input[i].c_str();
  61.                 bool flag = true;
  62.                 DWORD d = GetFileAttributes(folder); //проверка каталога на существование
  63.                 //cout << d << endl;
  64.                 if (d != 0xffffffff && (d & FILE_ATTRIBUTE_DIRECTORY)) //при существующем каталоге d=16 (понять почему)
  65.                 {
  66.                     cout << "mkdir: невозможно создать каталог «" << clearinput << "»: Файл существует" << endl;
  67.                     flag = false;
  68.                 }
  69.                 if (CreateDirectory(folder, NULL))
  70.                 {
  71.                     flag = false;
  72.                 }
  73.                 if (flag)
  74.                 {
  75.                     cout << "mkdir: невозможно создать каталог «" << clearinput << "»: Нет такого файла или каталога" << endl;
  76.                 }
  77.             }
  78.             cout << "user:~# ";
  79.             break;
  80.         }
  81.         case 1: // comm
  82.         {
  83.             cout << "Работа команды comm" << endl;
  84.             break;
  85.         }
  86.         case 2: // diff
  87.         {
  88.             cout << "Работа команды diff" << endl;
  89.             break;
  90.         }
  91.         case 3: // sort
  92.         {
  93.             cout << "Работа команды sort" << endl;
  94.             break;
  95.         }
  96.         case 4: // uniq
  97.         {
  98.             cout << "Работа команды uniq" << endl;
  99.             break;
  100.         }
  101.         case 5: // wc
  102.         {
  103.             int strings = 0;
  104.             int words = 0;
  105.             string str;
  106.             while (getline(cin, str, '\0'))
  107.             {
  108.                 for (int i = 0; i < str.length(); i++)
  109.                 {
  110.                     if (str[i] == '\n')
  111.                     {
  112.                         strings++;
  113.                     }
  114.                     if (((str[i] == ' ') && (str[i + 1] != '\n')) || (str[i] == '\n') && (str[i + 1] != ' '))
  115.                     {
  116.                         words++;
  117.                     }
  118.                 }
  119.             }
  120.             cin.clear();
  121.             cout << strings << '\t' << words << '\t' << str.length() << endl << "user:~# ";
  122.             break;
  123.         }
  124.         case 6: // cd  
  125.         {
  126.             v_input.erase(v_input.begin());
  127.             if (v_input.size() < 1)
  128.             {
  129.                 v_input.push_back("0");
  130.             }
  131.             if (!(v_input[0] == "0"))
  132.             {
  133.                 //char buffer[MAX_PATH];  закомментированные строки нужны для проверки директории
  134.                 const char* p = v_input[0].c_str();
  135.                 bool flag = true;
  136.                 if (v_input.size() > 1)
  137.                 {
  138.                     cout << "cd: слишком много аргументов" << endl;
  139.                     flag = false;
  140.                 }
  141.                 if (flag)
  142.                 {
  143.                     if (!SetCurrentDirectory(p))
  144.                     {
  145.                         cout << "cd: " << p << ": Нет такого файла или каталога" << endl;
  146.                     }
  147.                 }
  148.                 //GetCurrentDirectoryA(MAX_PATH, buffer);
  149.                 //cout << buffer << endl;
  150.             }
  151.             cout << "user:~# ";
  152.             break;
  153.         }
  154.         case 7: // пустой ввод
  155.         {
  156.             cout << "user:~# ";
  157.             break;
  158.         }
  159.         default:
  160.         {
  161.             cout << v_input[0] << ": команда не найдена" << endl;
  162.             cout << "user:~# ";
  163.             break;
  164.         }
  165.         }
  166.         v_input.clear();
  167.         key = 10;
  168.     }
  169.     cout << "Работа терминала завершена" << endl;
  170.     system("PAUSE");
  171.     return 0;
  172. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top