Форум: "Основная";
Текущий архив: 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.033 c