|
1 / 1 / 0
Регистрация: 12.11.2011
Сообщений: 11
|
|
Парсинг значений из командной строки12.11.2011, 16:31. Показов 12235. Ответов 13
Метки нет (Все метки)
Всем доброго времени суток,
столкнулся с необходимостью получения значений из командной строки, не просто чисел, а разделенных '/'. Тоесть, например, при запуске программы prgrm.exe 1/3 2/5 3/5 1/2 я должен разобрать эти "дроби". Мне нужно чтобы я мог получать пару чисел (1,3) (2,5) .... для последующей передачи их в функцию , для того, чтобы создавать экземпляры класса. Я довольно таки много времени провел в поисках решения... залез даже в библиотеки BOOST::spirit, так же почитал про getopt , но гетопт для моего случая вроде бы не подходит, а буст спирит вроде подходит, но там я столкнулся с другой проблемой=) там в созданный парсер необходимо передавать указатели на начало и конец строки, которую будем парсить. Не оч понимаю как извлечь из ARGV указатель на конец нужной строки. Тоесть , поправте меня если я не прав, имею на входе массив указателей char*argv[] каждый из которых указывает на область памяти , в которой лежит первый символ строки. А как получить указатель на послежний символ. Прошу подсказать мне, чем следует воспользоваться при данной задаче? В поиске я пошарил, но похожего не нашел, если все же такое уже было, не ругайтесь дайте ссылочку, буду очень благодарен. Еще раз повторю, что я могу пользоваться любыми библиотеками и т.д. лишь бы получить из такого входного представления, множество пар чисел=) Заранее благодарю
0
|
|
| 12.11.2011, 16:31 | |
|
Ответы с готовыми решениями:
13
Парсинг опций командной строки
Парсинг командной строки. |
|
|
||||||||||||||||
| 12.11.2011, 16:59 | ||||||||||||||||
|
MishQa, ну тут спирит - это как из пушки по воробьям. Вот на STL, хотя можно ещё проще.
Добавлено через 1 минуту Но это чревато тем, что можно просто не заметить ошибку пользователя. Добавлено через 1 минуту тестировал с этими параметрами:
1
|
||||||||||||||||
|
1 / 1 / 0
Регистрация: 12.11.2011
Сообщений: 11
|
|
| 12.11.2011, 17:03 [ТС] | |
|
Спасибо большое, ща попробую разобраться. А насчет еще проще, это как?
Просто я помню у меня когда-то давно была задача очень похожая, я там прям в конструктор передавал дробь в таком виде 1/2 и очень быстро там это парсил. Но совершенно не могу вспомнить как, а это было на лабах там и сторонних библиотек то никаких небыло
0
|
|
|
|
|
| 12.11.2011, 17:07 | |
|
MishQa, проще это в сишном варианте без std::istringstream, например. Но я не вижу смысла: во-первых придётся попрощаться с исключениями, выбрасываемыми std::istringstream, а во вторых мешать си и с++ это некрасиво. С другой стороны, можно "сшить" все argv в одну строку. Тогда парсить можно будет не смотря на пробелы. Если оно имеет смысл.
Добавлено через 54 секунды Сторонние библиотеки тут не имеет смысла привлекать.
1
|
|
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|||||||||||
| 12.11.2011, 17:36 | |||||||||||
|
MishQa, getopt, насколько я знаю, описывается стандартом POSIX и не распространен под виндой и виндовыми компиляторами.
boost.spirit не предназначен для разбора аргументов командной строки - для этого есть есть boost.program_options. Но дело не в этом. Для того, чтобы решить данную задачу, нужно просто разобрать строки, переданные в качестве параметра, ни getopt, ни, прости Г-споди, буст, тут не нужны. Вот пример на С:
1
|
|||||||||||
|
1 / 1 / 0
Регистрация: 12.11.2011
Сообщений: 11
|
|
| 12.11.2011, 17:57 [ТС] | |
|
Nameless One, Спасибо, наверное воспользую твоим вариантом, так как он для меня наиболее понятен, но я хочу так же разобраться с вариантом talis'a.
talis, заполни пожалуйста мои провалы=) буду тебе очень благодарен. по порядку прям... в мейне: создаем вектор, проходимся по всем аргументам командной строки и записываем их в волшебный для меня поток... я прочитал про него и понял только то что этот метод читает из объекта, и ничего не понял насчет второго аргумекнта(std::istringstream::in) передаваемого в конструктор, не мог бы мне разжувать зачем он? * Далее перегруженным оператором >> в структуру суем значение, оператор >> сам парсит, НО скажи плз что вот это ? if( !(is >> temp.a) || is.get() != '/' || !(is >> temp.b) ) throw std::runtime_error( "bat ratio format" ); ** И далее идем от начала до конца вектора и печатаем std::cout << it->a << '/' << it->b << "; "; it->a что это такое? итератор IT нас как бы идет по объектам засунутым в вектор? а '->' извлекает из структуры/класса , на котором установлен итератор данные? *** объясни 3 пунктика всего, если лень , то я пойму) спасибо всем, отличный форум, возмолжно у меня привьется любовь к форумам теперь)
0
|
|
|
|
|||
| 12.11.2011, 18:10 | |||
|
std::istringstream::in определяет режим работы потока. В данном случае это поток "ввода".
if( !(is >> temp.a) || is.get() != '/' || !(is >> temp.b) ) слева направо выполняются действия: ввода из потока в temp.a. Если нет ошибки - чтение следующего символа. Если он == '/' - ввод из потока в temp.b. Если нет ошибки - идём дальше. Если на одной из операций произошла ошибка, то throw std::runtime_error( "bat ratio format" ); выбрасывается исключение с текстом "bad ratio format". Кстати, у меня там очепятка Это исключение ловится в блоке try{ ... } catch( std::runtime_error &e ){ ... } в мэйне.Если что не понятно - спрашивайте. Удачи ![]() Добавлено через 1 минуту Альтернативный синтаксис у итератора - *(it).a и *(it).b. Как разыменовывание указателя на элемент массива. Добавлено через 1 минуту Не по теме: Nameless One, кстати, getopt поддерживается MinGW. Добавлено через 59 секунд
0
|
|||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||||
| 12.11.2011, 18:16 | ||||||||
|
MishQa, объекты istream в C++ имеют оператор void*, который используется для приведения к типу void*, где нулевой указатель сигнализирует об ошибке чтения/преобразования (на основе неявно установленных флагов), а ненулевой - об успешности операции. Перегруженный оператор >> возвращает объект istream. Что мы видем здесь?
0
|
||||||||
|
1 / 1 / 0
Регистрация: 12.11.2011
Сообщений: 11
|
|
| 12.11.2011, 18:39 [ТС] | |
|
Спасибо=) собрав ваши посты, я вроде во всем разобрался кроме...
if( !(is >> temp.a) || is.get() != '/' || !(is >> temp.b) ) тоесть из потока is вводится в темп + еще и возвращается 0 либо 1 в зависимости от успеха? И еще как он понимает is>>temp.a что нужно взять только 123214 из 123214/7 например, если считывание идет слева направо...Как он узнает тобишь где остановиться?
0
|
|
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|||
| 12.11.2011, 18:47 | |||
|
Добавлено через 3 минуты Не по теме: да что такое, опять меня опередили...
1
|
|||
| 12.11.2011, 18:49 | |
|
1
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
| 12.11.2011, 18:58 | |||||||||||
1
|
|||||||||||
|
1 / 1 / 0
Регистрация: 12.11.2011
Сообщений: 11
|
|
| 12.11.2011, 19:47 [ТС] | |
|
ForEveR, тоже интересный вариант, обязательно разберу, балгодарю=)
0
|
|
| 12.11.2011, 19:47 | |
|
Помогаю со студенческими работами здесь
14
Парсинг сторонней командной строки Прием значений от пользователя через параметры командной строки Парсинг строки для получения значений в кавычках Парсинг XML значений для получения значений Double
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
|
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|