Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Как читать стима строками.   Найти похожие ветки 

 
Evg12   (2004-09-19 21:12) [0]

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


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

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


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

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


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

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


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

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


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

Вот рабочий пример, правда на больших объемах данных я его не проверял. Здесь загоняется файл в 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;


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

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


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

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

F : TextFile;
S : String;

...
ReadLn(F,S)


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

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


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

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


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

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


 
Mim1 ©   (2004-09-20 08:38) [11]


> [5] Fedia   (19.09.04 23:16)

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


 
Slym   (2004-09-20 10:09) [12]

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


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

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


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

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


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

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


 
KSergey ©   (2004-09-21 13:33) [16]

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

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

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


 
KSergey ©   (2004-09-21 13:35) [17]

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
4-1094144591
Einstein
2004-09-02 21:03
2004.10.10
Окно на WinApi


4-1093933617
alex732
2004-08-31 10:26
2004.10.10
не определяется хендл дочернего окна


3-1095331359
werter
2004-09-16 14:42
2004.10.10
Как создать таблицу с вычисляемым полем


1-1096274244
DelphiLexx
2004-09-27 12:37
2004.10.10
Форма поверх всех окон


14-1094813897
STM
2004-09-10 14:58
2004.10.10
Как написать mailer