В этом посте объясняется, как написать с нуля командную строку (cmd) на C++. Мы рассмотрим очень простой вход в систему, директорию, выход и некоторые пользовательские команды (о программе). Вот окончательный результат:
Есть ли у вас учетная запись? да/нет
нет
Ваше имя пользователя будет: MediumUser
Вашим паролем будет: 1234
C:\Users\Name›› exit
Нажмите любую клавишу, чтобы продолжить. . .
Прежде всего откройте Visual Studio или любую другую программу, которая может компилировать C++, а затем создайте новый проект.
Добавляем нужные нам библиотеки:
#include <iostream> // the basic #include <string> // for entering the commands and login #include <fstream> //to write a file with users #include <stdio.h> //for some subprograms #include <Windows.h> //for some commands( dir, etc.) #include <filesystem> // to get the path #define WINDOWS #ifdef WINDOWS #include <direct.h> #define GetCurrentDir _getcwd #else #include <unistd.h> #define GetCurrentDir getcwd #endif
Теперь давайте добавим пространства имен:
using namespace std::experimental::filesystem; using namespace std;
После этого мы создадим функции записи и чтения:
ifstream read(“data.in”); //the same as fout ofstream write(“data.in”, ios_base::app);// we want to append, not to overwrite
А теперь просто добавьте следующее, чтобы иметь возможность получить рабочий каталог (путь):
std::string GetCurrentWorkingDir(void) { char buff[FILENAME_MAX]; GetCurrentDir(buff, FILENAME_MAX); std::string current_working_dir(buff); return current_working_dir; }
Ниже приведены наши пользовательские команды, мы можем добавить столько, сколько захотим:
void about() { cout << “CMD v1.0 BETA\n”; }
Создадим функцию, проверяющую команду:
void check(char msg[1000]) { if (strcmp(msg,”about”)==0)// if msg is the same as“about” about();//load our custom function else if (strcmp(msg,”exit”)==0)//if user want to left system(“pause”);//press any key to continue… else system(msg);//if msg is equal with dir,cd, etc. }
Если текущий пользователь хочет зарегистрироваться? Ниже приведена функция, которая ему нужна:
void create_user() { string usr1, pwd1; cout << “Your username will be: “; cin >> usr1; cout << “Your password will be: “; cin >> pwd1; write << usr1 << “ “ << pwd1 << endl;// write into our file the new data }
Нам нужны переменные:
char msg[1000];// the command string ver,usr,pwd,ac;
Приступаем к главному!
int main() {
Войдите или зарегистрируйтесь:
cout << “Do you have an account? y/n\n”; cin >> ac; if (ac == “n”) { create_user(); //place here the next step } if(ac == “y”) { cout << “Username: “; cin >> usr; cout << “\nPassword: “; cin >> pwd; while (getline(read, ver)) if (usr + “ “ + pwd != ver) cout << “”; else //place here the next step }
Теперь у нас все готово, кроме одного: командная строка…
while (strcmp(msg, “exit”) != 0)// if command is not exit { cout << GetCurrentWorkingDir() << “>> “; // cout curent path and >> cin >> msg;// read the message check(msg);// check and execute the command }
И финал:
read.close(); //close data.in write.close();// close data.in return 0;// exit the main }// finish the program
Теперь мы закончили. Вы можете добавить столько пользовательских команд, сколько захотите, и сделать командную строку идеальной для вас. Мы можем добавить к пути программу *.exe, сгенерированную после компиляции, и использовать наш cmd из основной командной строки! (например, wsl и bash) Если у вас есть предложения, дайте мне их в комментариях.
Удачного кодирования!
Код можно скачать с Pastebin: https://pastebin.com/PCW1TQLU