Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.221 c
1-1096359082
46_55_41_44
2004-09-28 12:11
2004.10.10
Не печатаются цвета из FastReport


3-1094728910
Heretic
2004-09-09 15:21
2004.10.10
По поводу процедуры "BeforePost" в Ttable


10-1028118297
LeS
2002-07-31 16:24
2004.10.10
Помогите начинающему. Регистрация ком.


14-1095732732
Думкин
2004-09-21 06:12
2004.10.10
С днем рождения! 21 сентября


4-1094106544
Алексей
2004-09-02 10:29
2004.10.10
Как узнть активный язык ввода в другом приложении?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский