2016-08-11 13 views
0

Я хотел бы использовать TStringList для синтаксического анализа вывода из «ipconfig/all».Как добавить большую строку в TStringList

Если я использую AddStrings, вся возвращаемая строка заканчивается в первом элементе. Я пытался использовать LoadFromStream но компилятор дает мне

не соответствующий функции-члена для вызова «LoadFromStream»

и

кандидат функции не жизнеспособна: нет известного перехода от " String '(aka' System :: UnicodeString ') до' System :: Classes :: TStream * 'для 1-го аргумента

Любые идеи по как я могу получить String в поток или другой способ вернуть строку String в мой TStringList?

TStringList *IPConfig = new TStringList; 
IPConfig->AddStrings(ExecuteExternalFile("ipconfig", "/all", false)); //everything returned ends up in one element defeating the purpose of using a TStringList 
IPConfig->LoadFromStream(ExecuteExternalFile("ipconfig", "/all", false)); //won't compile 
+0

удалось ли каждая строка в экземпляре 'String' или это только одна строка с новыми символами строки, указывающие на конец каждой строки? Почему бы не просто 'ExecuteExternalFile' вернуть' TStringList'? –

+1

Если я правильно помню, вам нужно сыграть с '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Прошло некоторое время с тех пор, как я использовал VCL. – user4581301

+0

ExecuteExternalFile просто возвращает одну гигантскую строку с символами новой строки. Есть ли способ заставить ExecuteExternalFile вернуть TStringList? Это функция Windows, поэтому я подумал, что это то, что есть, и мне приходится иметь дело с возвращаемой строкой как есть? – martinarcher

ответ

0

Спасибо, что вернули меня обратно в Delimiter. Я пересмотрел его и обнаружил, что в нем есть ошибка, которая требует, чтобы вы установили StrictDelimiter в значение true, в противном случае всегда будет делиться вашим текстом через пробел. Теперь он работает нормально. Благодаря!

IPConfig->StrictDelimiter = true; 
IPConfig->Delimiter = '\n'; 
IPConfig->DelimitedText = ExecuteExternalFile("ipconfig", "/all", false); 
+3

Это не ошибка. Это преднамеренно [и документировано] (http://docwiki.embarcadero.com/Libraries/en/System.Classes.TStrings.DelimitedText) поведение: "* Если для параметра' StrictDelimiter' установлено значение False, символ пробела также интерпретируется как разделитель, независимо от значения 'Delimiter'. Это неверно, если символ пробела встречается между кавычками. *« –

+0

Кажется нормальным, что пространство по-прежнему используется как разделитель по умолчанию, когда конкретный разделитель не установлен, кажется странным и неожиданным поведением продолжать использовать пространство после установки конкретного разделителя. Он бросил меня на петлю и несколько других, когда я искал решение в сети. О, ну, я думаю, после твоего сожжения ты не так легко забыл об этом в будущем. :) Спасибо за разъяснение Реми! – martinarcher

+0

Это может показаться вам странным, но это задуманное и задокументированное поведение, так что это не ошибка. –

0

Вы можете использовать TStringStream с LoadFromStream():

TStringList *IPConfig = new TStringList; 
TStringStream *Strm = new TStringStream(ExecuteExternalFile("ipconfig", "/all", false)); 
IPConfig->LoadFromStream(Strm); 
delete Strm; 
... 
delete IPConfig; 

 Смежные вопросы

  • Нет связанных вопросов^_^