![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли из файлового потока (TFileStream) читать построчно? [D7, Win2k]
Шурик Ш © (2005-03-11 17:10:00)Т.е. перебрать поочереди все строки файла, как это делает Readln?
BiN (2005-03-14 10:49:00) [1]Юрий Зотов © (14.03.05 10:40) [12]
В Win32 Файлы проецируются на адресное пространство процесса.
...
И поэтому нет нужды использовать MMF.
Не понял (с). Ты хочешь сказать, что CreateFile поецирует файлы на адресное пространсво процесса. С какого это перепугу?
MMF нужны для разделения данных между процессами, а здесь это не требуется. Файл и так будет memory-mapped, только не на разделяемую память, а на адресное пространство одного процесса.
Ошибаешься. MMF используется не только в IPC.
С уважением,
Юрий Зотов (2005-03-14 10:40:00) [2]> Шурик Ш (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?
Slym (2005-03-14 06:50:00) [3]
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;
YurikGL (2005-03-11 21:02:00) [4]
> DiamondShark © (11.03.05 20:51) [9]
тьфу ты... я думал в ем какая защита внутри есть...
DiamondShark (2005-03-11 20:51:00) [5]
> А что будет? Просто интересно...
Взорвётся.
YurikGL (2005-03-11 20:12:00) [6]
> > А если файл весит 100 мегов??? Он же его весь в память
> заберет?
>
> Не заберет
А что будет? Просто интересно...
TUser (2005-03-11 19:02:00) [7]
> А если файл весит 100 мегов??? Он же его весь в память заберет?
Не заберет
Anatoly Podgoretsky (2005-03-11 17:57:00) [8]Шурик Ш (11.03.05 17:10)
Нет, это оружие низкого уровня, для построчного, используй оружие более высокого уровня TextFile
BiN (2005-03-11 17:47:00) [9]Шурик Ш (11.03.05 17:10)
Я бы посоветовал использовать memory-mapped file.
Плохиш (2005-03-11 17:28:00) [10]
>Шурик Ш (11.03.05 17:10)
В вындовс символом конца строки является комбинация символов #13#10.
WondeRu (2005-03-11 17:19:00) [11]создай промежуточный TMemoryStream, который будет считывать предположим по 1 Мб, тока необходимо будет учитывать, что будут резаться строки...
Шурик Ш (2005-03-11 17:15:00) [12]А если файл весит 100 мегов??? Он же его весь в память заберет?
WondeRu (2005-03-11 17:14:00) [13]есть такая штука называется TStringList, можно сделать так
TStringList(obj).LoadFromStream(AFileStream);
а потом уже получаешь готовое и без геммороя!
TStringList(obj)[i]