Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Чтение из консоли


Автор: developer2007 25.6.2009, 17:04
Читаю из консоли с помощью ReadConsoleOutputCharacter(hStdOut,PChar(lpBuff),ScrBuff.dwMaximumWindowSize.X, dwReadCoord, dwAvail). Проблема в том, что когда текста в строчке меньше чем ScrBuff.dwMaximumWindowSize.X, то добавляется ненужный мусор из параметров запуска программы. Это было почёрпнуто из МСДН. Надо как-то читать ровно столько в строчке символов, сколько их там есть, чтобы не было мусора. Кол-во символов в строке всегда переменно.

Автор: kami 25.6.2009, 19:50
Что из себя представляет lpBuff?

Добавлено через 2 минуты и 28 секунд
В любом случае - нужно сперва прочитать с максимальным размером буфера, а потом подогнать размер буфера под реально прочитанное.

Автор: developer2007 26.6.2009, 21:20
lpBuff : string;
SetLength(lpBuff,ScrBuff.dwMaximumWindowSize.Y*ScrBuff.dwMaximumWindowSize.X);

Добавлено через 1 минуту и 20 секунд
А как тогда подогнать? Я же не знаю реальную длину текста - если при чтении беру по максимуму то в буфер попадает белиберда из параметров запуска и определить примерно где есть что только pos можно.

Автор: kami 26.6.2009, 23:33
Цитата(developer2007 @  26.6.2009,  21:20 Найти цитируемый пост)
 если при чтении беру по максимуму

а dwAvail не анализируете?

Цитата

lpNumberOfCharsRead 
[out] Pointer to a variable that receives the number of characters actually read.


Автор: Romikgy 26.6.2009, 23:42
Цитата(developer2007 @  26.6.2009,  20:20 Найти цитируемый пост)
SetLength(lpBuff,ScrBuff.dwMaximumWindowSize.Y*ScrBuff.dwMaximumWindowSize.X);

зачем ? 
если 

Цитата(developer2007 @  25.6.2009,  16:04 Найти цитируемый пост)
ReadConsoleOutputCharacter(hStdOut,PChar(lpBuff),ScrBuff.dwMaximumWindowSize.X, dwReadCoord, dwAvail).

и после этого всего имхо нужно 
Код

lpBuff:=trim(lpBuff);

Автор: kami 27.6.2009, 00:08
Цитата(Romikgy @  26.6.2009,  23:42 Найти цитируемый пост)

и после этого всего имхо нужно 
Код

lpBuff:=trim(lpBuff);

Только если после SetLength сделать 
Код

FillChar(lpBuff[1], Length(lpBuff), #32);

Иначе в "незадействованной" части строки будет мусор, который для Trim не по зубам.

Или (что правильнее - вдруг все прочитанное это пробелы, символы CR и LF  smile

после ReadConsoleOutputCharacter сделать 
Код

SetLength(lpBuff, dwAvail);


Автор: Romikgy 27.6.2009, 00:16
Цитата(kami @  26.6.2009,  23:08 Найти цитируемый пост)
Иначе в "незадействованной" части строки будет мусор, который для Trim не по зубам.

нинаю у мя ReadConsoleOutputCharacter где пусто в консоли было всегда выдает забитое место пробелами ,
а мусор имхо от того что выделеная область намного больше чем читаемая....

Автор: developer2007 29.6.2009, 19:02
Цитата(kami @  26.6.2009,  22:08 Найти цитируемый пост)
SetLength(lpBuff, dwAvail);

Спасибо, камрад, как я сам не додумался! Помогло.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)