Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> опции коммандной строки - howto? как их создать 
:(
    Опции темы
DPbIH
Дата 15.10.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 3.4.2007

Репутация: нет
Всего: нет



Всем привет!
Хочу для своего приложения создать опции коммандной строки, чтобы не привязываться к порядку следования аргументов. Как это получше сделать?? Мне в голову ничего элегантно-простого не лезет!
Спасибо за внимание! smile 
PM MAIL   Вверх
Fazil6
Дата 15.10.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: нет
Всего: 60



xgetopt.h
Код

// XGetopt.h  Version 1.2
//
// Author:  Hans Dietrich
//          [email protected]
//
// This software is released into the public domain.
// You are free to use it in any way you like.
//
// This software is provided "as is" with no expressed
// or implied warranty.  I accept no liability for any
// damage or loss of business that this software may cause.
//
///////////////////////////////////////////////////////////////////////////////

#ifndef XGETOPT_H
#define XGETOPT_H

#include <tchar.h>

extern int optind, opterr;
extern const TCHAR *optarg;

int getopt(int argc, TCHAR *argv[], const TCHAR *optstring);

#endif //XGETOPT_H



xgetopt.cpp
Код

#include "xgetopt.h"
#include <stdio.h>

const TCHAR *optarg;    // global argument pointer
int optind = 0;         // global argv index

int getopt(int argc, TCHAR *argv[], const TCHAR *optstring)
{
    static const TCHAR *next = NULL;
    if (optind == 0)
        next = NULL;

    optarg = NULL;

    if (next == NULL || *next == _T('\0'))
    {
        if (optind == 0)
            optind++;

        if (optind >= argc || argv[optind][0] != _T('-') || argv[optind][1] == _T('\0'))
        {
            optarg = NULL;
            if (optind < argc)
                optarg = argv[optind];
            return EOF;
        }

        if (_tcscmp(argv[optind], _T("--")) == 0)
        {
            optind++;
            optarg = NULL;
            if (optind < argc)
                optarg = argv[optind];
            return EOF;
        }

        next = argv[optind];
        next++;     // skip past -
        optind++;
    }

    TCHAR c = *next++;
    TCHAR *cp = _tcschr(optstring, c);

    if (cp == NULL || c == _T(':'))
        return _T('?');

    cp++;
    if (*cp == _T(':'))
    {
        if (*next != _T('\0'))
        {
            optarg = next;
            next = NULL;
        }
        else if (optind < argc)
        {
            optarg = argv[optind];
            optind++;
        }
        else
        {
            return _T('?');
        }
    }

    return c;
}



использование
Код

#include <iostream>
#include "xgetopt.h"
#include <windows.h>

static void Usage()
{
    char modulename[_MAX_PATH];

    GetModuleFileName(0, modulename, _MAX_PATH);
    strcpy(modulename, strrchr(modulename, '\\') + 1);
    *strrchr(modulename, '.') = '\0'; 
    
    std::cout <<
        "Usage: " << modulename << " <opt list>\n\nOptions:\n"
        <<
           "  -?           | Help\n"
        << "  -i <path>    | param i\n"
        << "  -l <path>    | param l\n"
        << "  -a < 0 || 1> | param a:\n"
        << "                 0 - opt 1\n"
        << "                 1 - opt 2\n"
        ;
}

int main(int argc, char* argv[])
{    

    for(int c;(c = getopt(argc, argv, "i: l: a: c:")) != EOF;)
    {
        switch(c)
        {
        
        case 'i':
            std::cout << " option i : " << optarg << "\n";
            break;
        case 'l':
            std::cout << " option l : " << optarg << "\n";
            break;
        case 'a':
            std::cout << " option a : " << optarg << "\n";
            break;
        case '?':
        default : Usage(); break;
            
        }
    }

    return 0;
}

PM MAIL   Вверх
jonie
Дата 16.10.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



кстати есть целые библиотеки что облегчают жизнь, хотя лично меня всегда устраивали конструкции вида:
Код

switch((WORD)(argv[i])){
....
}

по поводу библиотек : посмотрите 
argtable2  The project homepage can be found at http://argtable.sourceforge.net/
CCmdLine  гдето там : http://www.smalleranimals.com
TCLAP - Templatized Command Line Argument Parser http://sourceforge.net/project/showfiles.php?group_id=76645

ну  и в общем-то поройтесь на sf.net или  koders.com



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.