Главная страница
    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.031 c
14-1095340645
Программер_
2004-09-16 17:17
2004.10.10
Кто найдет ошибку?


4-1094514486
BMP
2004-09-07 03:48
2004.10.10
Можно ли прочитать файл открытый в монопольном режиме?


14-1095325756
}|{yk
2004-09-16 13:09
2004.10.10
Слова - табу, или как спровоцировать собеседника


14-1095292657
Мистер Х
2004-09-16 03:57
2004.10.10
Будущее MS Windows


14-1095927192
REP
2004-09-23 12:13
2004.10.10
Что такое поддержка MPEG4 в TV тюнерах?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский