#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()
orconsole_cmd.find_first_of()
для получения индекса для первой двойной кавычки, а затем использовать.find_lasr_of()
для поиска последней и извлечения промежуточной подстроки. Смотрите: std::basic_strin& Затем вы можете извлечь то, что стоит перед первой двойной кавычкой, и создатьstrin&stream
и проанализировать cmd и option из этого.