Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как читать стима строками. [D7, Win95/98, WinXP]


Evg12 ©   (2004-09-19 21:12:00) 

Как организовать чтение из стрима строками?
Тоесть нужно подобие ReadLn, толко применительно к стриму (включая обработку EOF).


KSergey   (2004-09-21 13:35:00) [1]

> [16] KSergey ©   (21.09.04 13:33)
> Есть у меня модуль TTextFileStream.

В смысле он как раз отличается только наличием Readln/Writeln.
Вот только не до конца по нормальному со всем увязан: либо читаем/пишем через эти методы и не двигаем позицию, либо - все на раскоряку пойдет.


KSergey   (2004-09-21 13:33:00) [2]

> выводить через memo1.lines.add - займет пол года,

Вызвать BeginUpdate/EndUpdate - это, конечно, влом?
А если можно вообще на лету обрабатывать - тогда зафиг вообще какие-то промежулочные буфера?? Читай - обрабатывай - пиши - дальше читай.. Ну и т.д.

Есть у меня модуль TTextFileStream. Правда, над TFileStream, но, думаю, переделать будет не трудно под другой. Не уверен в качестве, но работает. Выслать, ели интересно? Или тут покласть - может кто что скажет...


Evg12   (2004-09-21 12:40:00) [3]

To Fedia: Смотри [2], Если большой файл, знаешь скллько времени уйдет на загрузку. Мало того у меня string[64] из экономии памяти. Там лажа, такакя же как и вывод здорового текстовика в memo. Будешь выводить через memo1.lines.add - займет пол года, не говоря уж о том, что память рухнет. Поэтому все сгенеренное сначала в стрим, потом из стрима в мемо.
Может я конечно ошибаюсь, но у меня эта проблема возникла, когда создавал лог обмена между двумя аппаратными устройствами. И за минуту проходило около 1000000 сообщений. Я решил именно так.


Fedia   (2004-09-20 23:24:00) [4]

Evg12   (20.09.04 11:48) [13]
Аналогичные действия, что и в [5] можно выполнить и в двух строках:
   SL:=TStringList.Create;
   SL.LoadFromFile(FName);
Все остальное стабильности и надежности ради.


Evg12   (2004-09-20 11:48:00) [5]

To Fedya: Нихрена себе ты наворотил. У меня тоже самое в 5-и строках.
Ладно, скажу для чего надо, может способ другой есть:
Прочитать текстовый файл, пердварительно упакованый в ресурс. убрать из строк все после "//" сделать trim и записать в array of string, для последующей обработки. Помойму из ресурса кроме как через стрим ничего выдернуть не светит.


Slym   (2004-09-20 10:09:00) [6]

Для совместного доступа к файлам на 1 машине или на нескольких по сети?
Если 1 то лучшим вариантом будет Memory Mapper File.
Если 2 то постого выхода нет


Mim1   (2004-09-20 08:38:00) [7]


> [5] Fedia   (19.09.04 23:16)

Всеже чтение лучше реализовывать блоками поболее одного байта :).


Fedia   (2004-09-20 01:13:00) [8]

Defunct ©   (20.09.04 00:58) [9]
А это похоже был бы выход. Конечно переделывать много, но
если глюки будут продолжаться, то возможно советом воспользуюсь.
Спасибо.


Defunct   (2004-09-20 00:58:00) [9]

Fedia   (20.09.04 00:48) [8]
Ах вот оно что, совместный доступ.
тогда БД надо использовать. и писать, и читать будет гораздо удобней, да и доступ произвольный.


Fedia   (2004-09-20 00:48:00) [10]

Defunct ©   (20.09.04 00:23) [7]
С этим были глюки при совместном доступе к файлам нескольких приложений. То прочитать файл не могли, то сохранить в него. Приходилось сольно ухищряться, чтобы ошибок не было, и пользователь не ворчал.
А TMemoryStream, на сколько я понимаю, не открывает сам файл, а создает его копию в ОЗУ. Что как нельзя пришлось кстати.


Defunct   (2004-09-20 00:23:00) [11]

Чем не удовлетворяет:

F : TextFile;
S : String;

...
ReadLn(F,S)


Fedia   (2004-09-19 23:24:00) [12]

Fedia   (19.09.04 23:16) [5]
... в StringList.


Fedia   (2004-09-19 23:16:00) [13]

Вот рабочий пример, правда на больших объемах данных я его не проверял. Здесь загоняется файл в TMemoryStream, а затем посредством функции LoadString построчно переводится в StringGrid.


function OpenTextFile(FName: string; var SL: TStringList): Boolean;
var
 MS1  : TMemoryStream;
 int1 : Integer;
 str1 : string;
begin
 MS1 := TMemoryStream.Create;
 try
   MS1.LoadFromFile(FName);
     try
       repeat
         str1 := LoadString(MS1);
         SL.Add(str1);
       until
         MS1.Position >= MS1.Size;
       Result := true;
     except
       Result := false;
     end
 finally
   FreeAndNil(MS1);
 end;
end;

function LoadString(Stream: TStream): string;
var
 b       : byte;
 CLf,RFf : boolean;
 s       : string;
const
 CL : byte = $0D;
 RF : byte = $0A;
begin
 result := '';
 s      := '';
 CLf    := false;
 RFf    := false;
 while Stream.Position < Stream.Size do
   begin
     Stream.ReadBuffer(b,SizeOf(b));
     if b = CL then
       begin
         CLf:=true;
         if RFf then
           begin
             result:=s;
             break;
           end;
       end
               else
       if b = RF then
         begin
           RFf:=true;
           if CLf then
             begin
               result:=s;
               break;
             end;
         end
                 else s:=s+chr(b);
   end;
 result:=Trim(result);
end;


Evg12   (2004-09-19 23:04:00) [14]

To:Abel
"$0d$0a - всякие форматы попадаются." - Так по этому я и сказал что уродливо. Я имел в виду может есть стандартная функция, которуя я проушанил.


Abel   (2004-09-19 22:12:00) [15]

Для болших объемов вполне нормальное решение. На асме это выглядело бы еще уродливее ;-)
ЗЫЖ Я бы сделал разбивку на строки по всем возможным сочетаниям $0d$0a - всякие форматы попадаются.


Evg12   (2004-09-19 22:05:00) [16]

Забыл сказать. Размер стрима с текстовиком достаточно большой.
Я вообще-то сделал выделение строки по символами $0d,$0a
Работает нормально. Но... как-то выглядит уродливо....


Abel   (2004-09-19 21:55:00) [17]

Если объем данных умеренный - можете попробовать TStrings.LoadFromStream например.


Наверх

Титульная страница Поиск, карта сайта Написать письмо