Как разбить stringstream на вектор с 2 видами разделителей (пробел и кавычки)

#c

#c

Вопрос:

Кто-нибудь может помочь с разделением strin&stream на вектор?

У меня есть более ранняя реализация этого, которая выглядит следующим образом:

 int main()
{
    strin& console_cmd;
    std::vector<strin&&&t; cmdList;

    cout << "&&t;&&t; ";
    &etline(cin, console_cmd);

    istrin&stream iss(console_cmd);

    copy(istream_iterator<strin&&&t;(iss),
        istream_iterator<strin&&&t;(),
        back_inserter(cmdList));

    return 0;
}
  

Мои входные данные в основном выглядят следующим образом

 &&t;&&t; check -file /folder/filename.txt
  

Таким образом, командный список vector будет содержать

 cmdList[0] = check
cmdList[1] = -file
cmdList[2] = /folder/filename.txt
  

Позже у меня возникли проблемы с каталогом, особенно с каталогами с пробелами. Пример:

 &&t;&&t; check -file /folder name/filename.txt
  

Результат этого становится таким:

 cmdList[0] = check
cmdList[1] = -file
cmdList[2] = /folder
cmdList[3] = name/filename.txt
  

Я хочу, чтобы это выглядело следующим образом:

 cmdList[0] = check
cmdList[1] = -file
cmdList[2] = /folder name/filename.txt
  

Я думал об использовании разделителей, но я не уверен, как это реализовать.

РЕДАКТИРОВАТЬ: добавление того, как я буду использовать разделители

 &&t;&&t; check -file "/folder name/filename.txt"
  

Спасибо за вашу помощь!

Комментарии:

1. Если вы требуете, чтобы пользователь заключал имя файла в кавычки или использовал последовательность escapce, если она содержит пробелы, это можно сделать с помощью некоторого синтаксического анализа. Цитирование: check -file "/folder name/filename.txt" Escape seq: check -file /folder name/filename.txt но иногда это сложно. Особенно если символ, заключающий в кавычки, также может быть частью имени файла.

2. Вы всегда будете использовать абсолютный путь , начинающийся с '/' ? Если это так, вы можете использовать console_cmd.find() (или .find_first_of() ) функции-члены, чтобы найти первую, '/' обозначающую начало имени файла.

3. @TedLyn&mo Да, для меня это довольно сложно.

4. @DavidC.Rankin что касается пути abl = olute, не всегда. Иногда это может начинаться с «C:/user/folder name /…». Поэтому я подумал об использовании двойных кавычек («) в качестве разделителей. Хотя я не совсем уверен, как это реализовать.

5. Используя &etline() , вы сохраните двойные кавычки во входных данных. Таким образом, вы можете использовать console_cmd.find() or console_cmd.find_first_of() для получения индекса для первой двойной кавычки, а затем использовать .find_lasr_of() для поиска последней и извлечения промежуточной подстроки. Смотрите: std::basic_strin& Затем вы можете извлечь то, что стоит перед первой двойной кавычкой, и создать strin&stream и проанализировать cmd и option из этого.