Допустим, я хотел открыть функцию (она открывает файл, что-то с ним делает, а затем выплевывает результаты в другой файл). Используя argv и argc и просматривая все учебники в Интернете, я предполагаю, что если я напечатаю argv [0], я получу имя файла.
Мой вопрос: как мне установить, скажем, следующий argv [1.2.n] для функции. Таким образом, если пользователь введет open (после того, как пользователь окажется в каталоге программы), он откроет эту функцию.
Что-то вроде:
void file();
…
if (argv[1] == open){
file();
}
argv
имеет тип char*[]
(массив указателей типа char *). Вы не можете напрямую сравнивать строковые константы (тип char*
), который нужно процитировать. Вместо этого я предлагаю вам преобразовать его в строковый тип c ++:
#include <string>
void file(){
// ...
}
int main(int argc, char *argv[]) {
if(argc>=2)
{
if(std::string(argv[1]) == "open")
{
file();
}
}
else
{
// print usage
}
}
Первая строка в argv не является первым аргументом командной строки, обычно это путь к exe. Я рекомендую поместить аргументы командной строки в простую структуру данных.
vector<string> args(argv, argv + argc);
Теперь вы можете передать вектор своим функциям.
Передайте параметры вашей функции:
void file(int * argc, char * * argv)
{
//
}
int main(int argc, char * * argv)
{
if (argv[1] == open)
{
file(argc, argv);
}
return 0;
}
Не совсем понятно, о чем ты спрашиваешь. Если целью является
вызывать разные функции в зависимости от одного из аргументов,
Обычное решение состоит в том, чтобы использовать карту строк для указателей на
функции, а затем сделать что-то вроде:
MapType::const_iterator entry = map.find( argv[1] );
if ( entry == map.end() ) {
std::cerr << "Unknown function " << argv[1] << std::endl;
returnCode = 1;
} else {
(*entry->second)();
}