[Delphi] ReadFile>ReadLine

Для тех, кто хочет сделать мир лучше.
Ответить
Сообщение
Автор
MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#1 Сообщение 04.06.2009, 22:35

Нужна функция, чтобы конвертировать потокоые данные из функции ReadFile() в строки.
Запуск предполагается в цикле, поэтому функция должна быть примерно такой:

Код: Выделить всё

function ReadLineFromStdOut(hStdOut: Cardinal; var line: string): boolean;
Сам бьюсь над этим уже 3-й день, ничего не выходит. Тоесть выходит, но не то что нужно... :(

Примерно так нужно будет её использовать:

Код: Выделить всё

while true do
  begin
     if ReadLineFromStdOut(hStdOut, curr_line) then
        if curr_line='Enter passkey: ' then MyWriteToStdIn(hStdIn, 'yourPass');
  end;

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#2 Сообщение 05.06.2009, 00:35

А классические assign, readln, writeln, close ?

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#3 Сообщение 05.06.2009, 00:53

Как их настроить на чтение потока из пайпа?

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#4 Сообщение 05.06.2009, 01:31

Ах вон оно что =) . Я не в курсе. А для чего тебе? Сделай лучше батником ввод данных.

Добавлено спустя 9 минут 43 секунды:
Может это: http://sources.ru/cpp/using_anonymous_pipes.shtml ?

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#5 Сообщение 05.06.2009, 01:34

Батником не канает...
А насчёт примера - опять С++ :(... :)

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#6 Сообщение 05.06.2009, 01:44

Ну,так тебе-то что надо?

Код: Выделить всё

PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);

    //Проверяем, есть ли данные для чтения в stdout

    if (bread != 0)
    {
      bzero(buf);
      if (avail > 1023)
      {
        while (bread >= 1023)
        {
          ReadFile(read_stdout,buf,1023,&bread,NULL);  //читаем из
                                                       // пайпа stdout
          printf("%s",buf);
          bzero(buf);
        }
      }

      else {
        ReadFile(read_stdout,buf,1023,&bread,NULL);
        printf("%s",buf);
      }
    }

Добавлено спустя 2 минуты 17 секунд:
И зайди в асю

Добавлено спустя 2 минуты 31 секунду:
Хотя...нужно всё :pardon:

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#7 Сообщение 05.06.2009, 02:11

Нет, там просто пример захвата приложения :) А мне ужно чтобы из хваченного пайпа выделять именно по 1 строке. А там нефильтровано по 1023 символа...

Добавлено спустя 1 минуту 16 секунд:
$t@t!c_V()1D
я в асе О_о

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#8 Сообщение 05.06.2009, 02:17

Так ты смотри #13 и #10 :pardon:

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#9 Сообщение 05.06.2009, 03:51

Не понял чего-то я... Где #10 и #13? У меня появилась идея читать по одному символу и добавлять их в строку пока какой-нибудь не будет равен #10... Но что-то я неуверен... Как это скажется на производительности кода, есть мысли? Просто у меня сейчас используется огромная функция, портированная из С++ с mignw'овским "наречием". Так вот, строки она составляет нормально но не завершает свою работу после прочтения одной строки, а продолжает считывать и разбивать строки не присваивая var-переменной значение одной строки... Кароче в бескнечный while уходит... И на каком этапе из него выходить непонятно, т.к. функция использует свою же память для заготовок слеующего парсинга, что хитро и изменению не поддаётся... Хотяяяя... :) Кажется это я туплю.... ;)

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#10 Сообщение 05.06.2009, 07:01

Ну, то же самое, что и Chr(13) Chr(10) - возврат каретки и переход на новую строку. Парсить до этих символов и всё - вот тебе и строка ;)

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#11 Сообщение 06.06.2009, 01:36

У меня всё заработало, вопрос снят :)

Ответить