powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: построчное чтение данных из памяти
24 сообщений из 49, страница 2 из 2
Lazarus: построчное чтение данных из памяти
    #39857345
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док...
ps. надеюсь #13 и #10 при любой погоде остануться однобайтными
. Иначе придется, как в Дельфях, из CodePointSize/UTF8CodepointSize городить огород.
Напрасно надеешься :)
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857346
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докps. надеюсь #13 и #10 при любой погоде остануться однобайтными
. Иначе придется, как в Дельфях, из CodePointSize/UTF8CodepointSize городить огород.вход с консоли останется тот же, однобайтный - тут ничего не поменяется надеюсь
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857357
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докесли я правильно тебя понял, все упирается в то, какого типа строка в фпц на момент сборки кода.
Именно. У тебя под буфер для винды используется конкретизированный тип, а для прочих систем дефолтный. Однако, буфер то байтовый.

Кстати, у тебя там поиск маркера конца строки сможет обработать ситуацию, когда пара #13#10 будет разделена?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857358
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще, зря ты со строками связался...
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857360
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокМужики,
понадобилось читать и писать вывод запускаемой внешней программы...
Задача именно в такой постановке? Нельзя что-то более вменяемое для обмена данными организовать?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857371
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyКстати, у тебя там поиск маркера конца строки сможет обработать ситуацию, когда пара #13#10 будет разделена?
так вот, почему у тебя сначала #13 ищется, а потом #10. Таки придется от строк отказываться


ёёёёёНельзя что-то более вменяемое для обмена данными организовать?
ты меня спрашиваешь? Название топика читал? Это я спросил совета, в надежде на твой ответ :)
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857374
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
04.09.2019 16:34, Док пишет:

МП>> может так случиться, что ты получил из "трубы" последовательность, которая не заканчивается #10, #13, #13#10
> так я в коде вроде бы учел этот момент. Нет?

я твой код не вижу.
ты его в спойлер прячешь.
по NNTP оно не отображается.
а вообще, спойлеры для того, чтоб в них прятать женскую половую письку.
а не код, на техническом форуме.

> зы. вообще, я пишу для себя кроссплатформенную утилитку с использованием gbak/gfix/gstat/isql - покатаю код еще там...

все эти "кроссы" от лукавого.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857395
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийты его в спойлер прячешь.
по NNTP оно не отображается.
"вон оно че, Михалыч" ©

а я пальцы и колесико мышки читающих берегу. Не люблю портянки кода на 3 экрана :)

Мимопроходящийвсе эти "кроссы" от лукавого.
ага, ты это юзверю объясни, который то в лине, то в иосе чего-то там делает :)
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857409
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
04.09.2019 17:31, Док пишет:

МП>> все эти "кроссы" от лукавого.
> ага, ты это юзверю объясни, который то в лине, то в иосе чего-то там делает :)

но gbak-и то есть и для линуха, и для винды.
а под яось нет и не будет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857428
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийно gbak-и то есть и для линуха, и для винды.
а под яось нет и не будет.
сегодня для меня день открытий :)
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857737
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanне поясните о чем речь?
На тот случай, когда из базы приходит больше двух(четырех) гигов.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857739
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокМимопроходящийвсе эти "кроссы" от лукавого.
ага, ты это юзверю объясни, который то в лине, то в иосе чего-то там делаетда вполне типичная ситуация для кучи проектов к-е из одной кодовой базы собираются и работают как под вынь так и хрюндиксы. я вот сервисы и туда и сюда собираю из vs, правда ни разу не морды так что иосы к счастью не беспокоят
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857743
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarНа тот случай, когда из базы приходит больше двух(четырех) гиговлюбопытно, жаль на посмотреть не выложено ведь?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857804
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanлюбопытно, жаль на посмотреть не выложено ведь?
stanilarНо вот времени не было сделать, а теперь уже бывший дельфиец...

Нет, как уже было сказано, не выложено. Но время было интересное. Был молод, думал что знания о том, как работает менеджер памяти равносильно успеху в жизни. Все делал в поте лица. Правда, мне самому так и осталось не понятным, помогло-ли(потому и не стал выкладывать). А теперь уже нет ни времени дальше разбираться, ни желания копаться в том, что больше никогда не понадобится. Осталась только ностальгия по ушедшему без пользы.

P/S/ Могу выслать почтой то, что (возможно) было тем, о чем идет речь. Идея была в том, что DS работает с памятью аналогично TStream. Вот и был сделан наследник TStream для кэша DS, который окном в 64Кб читал/писал кэш. Сам наследник это отдельный компонент, а вот как хакнуть DS из родных библиотек это два сторонних компонента + танцы с бубном.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857821
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarМогу выслать почтой то, что (возможно) было тем, о чем идет речь
в профиле ящик актуальный?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857824
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,

Да, только тему нужно написать читаемую, а то этот ящик у меня для всего. Пошел копать исходники
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857852
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilar,
в заголовке sql.ru
если таки разыщется и не жалко то я бы глянул из любопытства о чем речь. спасибо
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857858
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док...

ёёёёёНельзя что-то более вменяемое для обмена данными организовать?
ты меня спрашиваешь? Название топика читал? Это я спросил совета, в надежде на твой ответ :)
Ну я не знал, что тебе бэкап/рестор нужен FB. Поди из стартового топика пойми. Я вот в клиентское приложение встроил и бэкап, и рестор. Используя соотв. компоненты библиотеки доступа. И никакого чтения из памяти, десяток строк кода, и все.
Или тебе прямо обязательно именно в твоей постановке задачу решать?
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857919
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.09.2019 12:46, ёёёёё пишет:
> Я вот в клиентское приложение встроил и бэкап, и рестор.
> Используя соотв. компоненты библиотеки доступа.

через TIBServices ты НЕ можешь получить бекап с удалённого сервера себе "у папочку" на десктопе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857931
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

это да, но нужно ли сие топикстартеру?

ЗЫ: как-то делал копирование удаленной базы на локальный комп, тоже совсем немного работы: за основу взял пример "клонирование базы" из состава икземплов к UIB. Чуть доточил для фич новой СУБД, результаты сравнивал в DB Comparer.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39857989
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёНу я не знал, что тебе бэкап/рестор нужен FB. Поди из стартового топика пойми. Я вот в клиентское приложение встроил и бэкап, и рестор. Используя соотв. компоненты библиотеки доступа. И никакого чтения из памяти, десяток строк кода, и все.
птицын b/r - это частный случай, который запросто решается в случае получения ответа на вопрос стартового топика.

Мимопроходящийчерез TIBServices ты НЕ можешь получить бекап с удалённого сервера себе "у папочку" на десктопе.

Компоненты - оне пишутся компонентописателями. Тот IBX, который сейчас репах Лазаревского OPM, усиленно пилится и даже теперь позволяет динамически грузить клиентскую библу, как это делали ФИБы. Причем, он, автор, разделил свои компоненты условно на legacy (которые позволяли делать b/r только на стороне сервера) и современные (эти теоретически позволяют все), но они еще кривые, автор - обладает весьма большой инертностью и упрямством; пока его убедишь поправить тот или иной косяк, особенно, если он в этом не убежден .... :)

Посему проще написать свою гуишную обертку (к тому же, всегда есть возможность прикрутить к ней все новые фишки). И в простом варианте я это сделал, но хочется большего функционала красивостей, нежели есть в IBE, и проч.проч.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39858007
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,
авторптицын b/r - это частный случай, который запросто решается в случае получения ответа на вопрос стартового топика.
Страшно представить, что ты затеял.
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39861071
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во, наконец-то сегодня руки дошли. Код специально не прячу под спойлер для читающих по NNTP. Кому нетрудно, погоняйте у себя, плз (проект приаттачил) - теоретически должен работать и под стабильные Лазарь и фпц.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
procedure TForm1.btnGoClick(Sender: TObject);
const
  BUF_SIZE = 1024*2; // Размер буфера для чтения выходных данных блоками
  ConstFormatStr = '%d. ~ %s';//строка формата для подстановки вывода текста в мемо
var
{$IFDEF MSWINDOWS}
Buffer: RawByteString = '';
BufferStg: RawByteString = '';//буфер-накопитель
{$ENDIF}
{$IFDEF UNIX}
Buffer: String = '';
BufferStg: String = '';//буфер-накопитель
{$ENDIF}
  StrCounter: Integer = 0;//счетчик выводимых memoOutput строк
  BytesRead: LongInt = 0;//кол-во считанных из буфера байт
  LineEndingPos_13: Integer = 0;//позиция символа возврата каретки #13(CR)
  LineEndingPos_10: Integer = 0;//позиция символа перевода строки #10(CR)
  dt: TDateTime;
begin
  memoOutput.Clear;

  {$IFDEF MSWINDOWS}
  // В Windows команду dir нельзя использовать напрямую, потому что она является встроенной
  // командой оболочки. Поэтому нужны cmd.exe и дополнительные параметры
  AProcess.Executable := 'c:\windows\system32\cmd.exe';
  AProcess.Parameters.Add('/c');
  AProcess.Parameters.Add('dir /s c:\windows\system32');
  {$ENDIF}
  {$IFDEF UNIX}
  AProcess.Executable := '/bin/ls';
  AProcess.Parameters.Add('--recursive');
  AProcess.Parameters.Add('--all');
  AProcess.Parameters.Add('-l');
  {$ENDIF}

  AProcess.Options := [poUsePipes, poStderrToOutPut, poNoConsole];

  //Запуск процесса (выполнение команды dir/ls)
  AProcess.Execute;

  dt:= Now;
  memoOutput.Lines.Add('==== процесс начат: ' + FormatDateTime('dd.mm.yyyy h:mm:ss:zzz am/pm',dt) + ' ====');
  memoOutput.Lines.Add('');

  SetLength(Buffer,BUF_SIZE);//задаем минимальный размер Buffer (как правило размер Pipes в ОС не превышает 2kB)
  BytesRead:= AProcess.Output.Read(Buffer[1],Length(Buffer));//читаем в Buffer и получаем кол-во считанных байт BytesRead;

  repeat
    memoOutput.Lines.BeginUpdate;
    try
      if BytesRead > 0 then
      begin
        SetLength(Buffer,BytesRead);

        {LineEnding - алиас для sLineBreak:
        Win = #13#10
        Unix = #10
        Mac OS до v.9 = #13}

        {$IFDEF MSWINDOWS}
        //получаем позицию #13 в строке
        LineEndingPos_13:= Pos(#13,Buffer);

        repeat
          case LineEndingPos_13 of
            0:
              begin
                BufferStg:= BufferStg + Buffer;
              end;
            1://#13 в начале строки
              begin
                LineEndingPos_10:= Pos(#10, Buffer);

                case (LineEndingPos_10 - LineEndingPos_13) of
                  1: //#10(LF) следует за #13(CR)
                    begin
                      Inc(StrCounter);
                      //сбрасываем буфер-хранилище в memo...
                      memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,WinCPToUTF8(BufferStg)]));

                      //очищаем буфер-хранилище
                      BufferStg:='';

                      //откусываем от начала буфера символы перевода строки #13#10(CRLF)
                      Delete(Buffer,1,2); //... и крутим цикл дальше
                    end;
                  else //после #13(CR) следует любой символ, кроме #10(LF), или нет вообще символов
                    begin
                      //клеим символ возврата каретки #13(CR) к буферу-накопителю
                      BufferStg:= BufferStg + #13;

                      //откусываем от начала буфера символ возврата каретки #13(CR)
                      Delete(Buffer,1,1); //... и крутим цикл дальше
                    end;
                  end;
              end;
            else //#13(CR) в середине или в конце буфера
              LineEndingPos_10:= Pos(#10, Buffer);
              case (LineEndingPos_10 - LineEndingPos_13) of
                1: //#10(LF) следует за #13(CR)
                  begin
                    //копируем часть буфера до #13(CR) в буфер-хранилище
                    BufferStg:= BufferStg + Copy(Buffer,1,LineEndingPos_13 - 1);

                    Inc(StrCounter);

                    //сбрасываем буфер-хранилище в memo...
                    memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,WinCPToUTF8(BufferStg)]));

                    //очищаем буфер-хранилище
                    BufferStg:='';

                    //отрезаем спереди часть буфера вместе BufferStg + символами перевода строки #13#10(CRLF)
                    Delete(Buffer,1, LineEndingPos_13 + 1);//... и крутим цикл дальше
                  end;
                else //после #13(CR) следует любой символ, кроме #10(LF), или нет вообще символов
                  begin
                    //клеим его к буферу-накопителю
                    BufferStg:= BufferStg + #13;

                    //откусываем от начала буфера символ возврата каретки #13(CR)
                    Delete(Buffer,1,1);//... и крутим цикл дальше
                  end;
              end;
          end;
          LineEndingPos_13:= Pos(#13,PChar(Buffer));
        until LineEndingPos_13 = 0;
        {$ENDIF}
        {$IFDEF UNIX}
        //получаем позицию #10 в строке
        LineEndingPos_10:= Pos(#10,Buffer);

        repeat
          case LineEndingPos_10 of
            0:
              begin
                BufferStg:= BufferStg + Buffer;
              end;
            1: //#10 в начале строки
              begin
                Inc(StrCounter);
                //сбрасываем буфер-хранилище в memo...
                memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));

                //очищаем буфер-хранилище
                BufferStg:='';

                //откусываем от начала буфера символ перевода строки #10(LF)
                Delete(Buffer,1,1);

                //... и крутим цикл дальше
              end
            else //#10(LF) в середине или в конце буфера
              begin
                //копируем часть Buffer до #10(LF) в буфер-накопитель
                BufferStg:= BufferStg + Copy(Buffer,1,LineEndingPos_10 - 1);

                Inc(StrCounter);
                //сбрасываем буфер-хранилище в memo...
                memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));


                //очищаем буфер-хранилище
                BufferStg:='';

                //отрезаем спереди часть буфера вместе BufferStg + символом перевода строки #10(LF)
                Delete(Buffer,1,LineEndingPos_10);

                //... и крутим цикл дальше
              end;
          end;
          LineEndingPos_10:= Pos(#10,Buffer);
        until LineEndingPos_10 = 0;
        {$ENDIF}
      end;
    finally
      memoOutput.Lines.EndUpdate;
      memoOutput.SelStart := UTF8Length(memoOutput.Text);
    end;
    Sleep(10);
    Application.ProcessMessages;

    SetLength(Buffer,BUF_SIZE);
    BytesRead:= AProcess.Output.Read(Buffer[1],Length(Buffer));//читаем в Buffer и получаем кол-во считанных байт BytesRead;
  until BytesRead = 0;

  //сливаем остатки буфера-накопителя в Мемо
  if Length(BufferStg) > 0 then
  begin
    Inc(StrCounter);
    //сбрасываем буфер-хранилище в memo...
    {$IFDEF MSWINDOWS}
    memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));
    {$ENDIF}
    {$IFDEF UNIX}
    memoOutput.Lines.Add(Format(ConstFormatStr,[StrCounter,BufferStg]));
    {$ENDIF}

  end;
  dt:= Now;
  memoOutput.Lines.Add('');
  memoOutput.Lines.Add('==== процесс закончен: ' + FormatDateTime('dd.mm.yyyy h:mm:ss:zzz am/pm',dt) + ' ====');
end;



@Kazantsev Alexey

че-та не стал я заморачиваться с байтами (в отладке сложнее), со строками проще, тем более, что StringElementSize для стрингов в *nix'ах равен все равно равен StringElementSize для RawByteString под винды. Если покажешь пример, буду благодарен. :)
...
Рейтинг: 0 / 0
Lazarus: построчное чтение данных из памяти
    #39861141
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докче-та не стал я заморачиваться с байтами (в отладке сложнее), со строками проще
Чего там отлаживать, прости господи... Хотя, дело хозяйское, конечно.

Доктем более, что StringElementSize для стрингов в *nix'ах равен все равно равен StringElementSize для RawByteString под винды
Пока равен.
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: построчное чтение данных из памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]