Как бы вы использовали оператор if / then, используя argv [], после ввода опции / параметра?
Например, a.out -d 1 sample.txt против a.out -e 1 sample.txt.
int main (int argc, char *argv[])
{
ifstream infile(argv[3]);
int c;
int number = 0;
int count = 0;
while ( infile.good() ) {
if (argv[1] == "-d")
{
c = infile.get();
number = atoi(argv[2]);
if (number == count)
{
cout.put(c);
count = 0;
}
else
count++;
}if (argv[1] == "-e")
{
cout << "entered -e" << endl; //testing code
}}//end while
}//end main
Вы не можете использовать оператор равенства для сравнения строк в стиле C, вы должны использовать std::strcmp
:
if (std::strcmp(argv[1], "-d") == 0)
Причиной этого является то, что ==
Оператор сравнивает указатели не то, на что они указывают.
Я надеюсь, что вы хотите проверить входной параметр -d или же -е, право?
если это так, пожалуйста, используйте strcmp ()
if (! strcmp (argv [1], «- d»))
{
count++;
printf("\ncount=%d",count);
}
if (!strcmp(argv[1],"-e"))
{
printf("entered -e"); //testing code
}
Первая ошибка в самой первой строке main
:
ifstream infile(argv[3]);
Вы не можете написать это, потому что третьего аргумента нет. Когда вы вызываете свою программу следующим образом:
a.out -d 1 < sample.txt
тогда командная строка, которую видит программа, выглядит так:
argv[0] = "a.out"argv[1] = "-d"argv[2] = "1"
< sample.txt
напротив, интерпретируется оболочкой напрямую, а файл передается на стандартный ввод вашей программы — и вы ничего не можете сделать, чтобы изменить это внутри вашей программы.
Что касается самого анализа, не делайте этого внутри цикл, который читает файл, сделайте это раньше и установите соответствующие флаги.
Для фактического разбора я бы предложил использовать библиотеку, чтобы избавить вас от большой боли. Стандартный инструмент Unix getopt
но у него есть только интерфейс C. Есть несколько библиотек C ++, среди них Boost.Program_Options что немного сложнее, на мой вкус, хотя.
Argc / argv происходит из C и довольно громоздок в использовании, поэтому, когда выполняется больше, чем просто передача аргументов, вы можете преобразовать аргументы в вектор строк и работать в стиле C ++:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
main(int argc, char* argv[])
{
std::vector<std::string> args;
std::transform(argv+1, argv+argc, std::back_inserter(args), [](char* arg){ return std::string(arg); });
if (args.at(1) == "-d") { std::cout << "Arg 1 = -d" << "\n"; }
for (auto& arg: args) { std::cout << "arg: " << arg << "\n"; }
}
Тем не менее, вам нужно проверить, что аргумент присутствует. Если это базовый инструмент и допустимо, чтобы инструмент прерывался, когда параметр отсутствует, вы можете получить доступ к элементам args с помощью args.at(x)
вместо args[x]
Или проверить этот ТАК вопрос для парсера аргумента.
голец argv [] является массивом char *
так
if (string(argv[1]) == "-d")