
В этом посте объясняется, как написать с нуля командную строку (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