Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли из файлового потока (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]


Наверх

Титульная страница Поиск, карта сайта Написать письмо