Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
ВнизМожно ли из файлового потока (TFileStream) читать построчно? Найти похожие ветки
← →
Шурик Ш (2005-03-11 17:10) [0]Т.е. перебрать поочереди все строки файла, как это делает Readln?
← →
WondeRu © (2005-03-11 17:14) [1]есть такая штука называется TStringList, можно сделать так
TStringList(obj).LoadFromStream(AFileStream);
а потом уже получаешь готовое и без геммороя!TStringList(obj)[i]
← →
Шурик Ш (2005-03-11 17:15) [2]А если файл весит 100 мегов??? Он же его весь в память заберет?
← →
WondeRu © (2005-03-11 17:19) [3]создай промежуточный TMemoryStream, который будет считывать предположим по 1 Мб, тока необходимо будет учитывать, что будут резаться строки...
← →
Плохиш © (2005-03-11 17:28) [4]
>Шурик Ш (11.03.05 17:10)
В вындовс символом конца строки является комбинация символов #13#10.
← →
BiN © (2005-03-11 17:47) [5]Шурик Ш (11.03.05 17:10)
Я бы посоветовал использовать memory-mapped file.
← →
Anatoly Podgoretsky © (2005-03-11 17:57) [6]Шурик Ш (11.03.05 17:10)
Нет, это оружие низкого уровня, для построчного, используй оружие более высокого уровня TextFile
← →
TUser © (2005-03-11 19:02) [7]
> А если файл весит 100 мегов??? Он же его весь в память заберет?
Не заберет
← →
YurikGL © (2005-03-11 20:12) [8]
> > А если файл весит 100 мегов??? Он же его весь в память
> заберет?
>
> Не заберет
А что будет? Просто интересно...
← →
DiamondShark © (2005-03-11 20:51) [9]
> А что будет? Просто интересно...
Взорвётся.
← →
YurikGL © (2005-03-11 21:02) [10]
> DiamondShark © (11.03.05 20:51) [9]
тьфу ты... я думал в ем какая защита внутри есть...
← →
Slym © (2005-03-14 06:50) [11]
procedure Writeln(Stream:TStream;const Data:string);
begin
Stream.WriteBuffer(PChar(Data)^,length(Data));
Stream.WriteBuffer(#13#10,2);
end;
function ReadLn(Stream:TStream):string;
const cCR = #10; cLF = #10; cEOF = #26;
var Ch:Char;
begin
result:="";
while Stream.Read(Ch,1)>0 do
begin
if Ch=cLF then break;
if Ch=cEOF then break;
if Ch<>cCR then
begin
result:=result+Ch;
continue;
end;
if Stream.Read(Ch,1)=0 then break;
if Ch=cLF then break;
if Ch=cEOF then break;
result:=result+cCR+Ch;
end;
end;
← →
Юрий Зотов © (2005-03-14 10:40) [12]> Шурик Ш (11.03.05 17:15) [2]
> YurikGL © (11.03.05 20:12) [8]
В Win32 Файлы проецируются на адресное пространство процесса и подгружаются кусками, по мере необходимости. Естественно, при этом работают буферизация и кэширование.
Попробуйте запустить 100-метровый видеоролик на машине с 64-метровой памятью. Работает?
То-то и оно, что работает.
> WondeRu © (11.03.05 17:19) [3]
Поэтому загружать файл кусками еще и самому нет необходимости.
> BiN © (11.03.05 17:47) [5]
И поэтому нет нужды использовать MMF. MMF нужны для разделения данных между процессами, а здесь это не требуется. Файл и так будет memory-mapped, только не на разделяемую память, а на адресное пространство одного процесса.
> Шурик Ш (11.03.05 17:10)
Если файл не текстовый, то строки в нем Вы не переберете никак потому что их там просто нет. А если текстовый, что почему бы не использовать ту самую ReadLn?
← →
BiN © (2005-03-14 10:49) [13]Юрий Зотов © (14.03.05 10:40) [12]
В Win32 Файлы проецируются на адресное пространство процесса.
...
И поэтому нет нужды использовать MMF.
Не понял (с). Ты хочешь сказать, что CreateFile поецирует файлы на адресное пространсво процесса. С какого это перепугу?
MMF нужны для разделения данных между процессами, а здесь это не требуется. Файл и так будет memory-mapped, только не на разделяемую память, а на адресное пространство одного процесса.
Ошибаешься. MMF используется не только в IPC.
С уважением,
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c