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

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

eof tfilestream [D5, 95/98]


e+e|e ©   (2012-01-13 15:32:00) 

читаю текстовый файл tfilestreamом, где
у него аналог:
while not eof (f) do???


megavoid   (2012-01-14 18:36:00) [1]

а да, > e+e|e   (13.01.12 15:32) читаю текстовый файл tfilestreamом, где у него аналог while not eof (f) do??? [0]
Unit откуда-то с просторов инета:
unit textfilestream;
interface
uses Classes;
type
 TTextFileStream = class(TFileStream)
 private
   buf: AnsiString;
   bp, bs:  Integer;
 public
   eof: Boolean;
   function ReadChar: AnsiChar;
   function ReadLn: String;
 end;
implementation
function TTextFileStream.ReadChar: AnsiChar;
begin
 if (bs = 0) or (bp = bs) then
 begin
   bs := 65536;
   SetLength(buf, bs);
   bs := Read(buf[1], bs);
   if bs < Length(buf) then SetLength(buf, bs);
   if (bs = 0) then eof := True;
   bp := 0;
 end;
 Inc(bp);
 if bp <= bs then Result := buf[bp] else result := #0;
end;
function TTextFileStream.ReadLn: string;
var
 c: AnsiChar;
begin
 Result := '';
 while not eof do
 begin
   c := ReadChar;
   if c = #13 then Break;
   if c <> #10 then result := result + c;
 end;
end;
end.


потом можно делать так:
T := TTextFileStream.Create(Edit1.Text, fmOpenRead or fmShareDenyNone);
try
 while not T.eof do String := T.ReadLn;
finally
 T.Free;
end;

вот и eof


megavoid   (2012-01-14 17:30:00) [2]

среднюю чтения я поднимаю, вытаскивая читаемый файл на отдельный физический винт, получается около 70 мб/с
хочу сделать нечто наподобие нтфса, хранить в сжатом виде (до 60% убирается), читать сжатое, в памяти разжимать в строки и уже там считать переводы строк, надо только сперва потестить, будет ли смысл в приросте скорости, и будет ли он вообще


Anatoly Podgoretsky   (2012-01-14 17:03:00) [3]

А если из Мака, то вообще нет #10 , но FileMapping в данном случае самый быстрый способ, но 200 гб при средней менее 50 мб, только на чтение потребуется более часа, а у автора бесконечность.


megavoid   (2012-01-14 16:48:00) [4]

мне вот именно с большими (и ещё больше, до 100-200 гб бывают у меня файлы) интересно кто как делает, можно ещё через CreateFileMapping с фреймом, и внутри фрейма #10 считать (и из винды, и из *никс бывают файлы) и разбивать на строки, но по скорости этот метод сравним с assign/readln, то есть в любом случае упираемся в скорость чтения с винта :(


DVM   (2012-01-14 14:55:00) [5]

c TReader только надо иметь в виду, что первыми 4 байтами он считает длину строки, а потом уже столько байт в строку, сколько он считал в первый раз.
Т.е. если это просто текстовый файл, то нужно менять логику TReader или использовать что-то другое.


megavoid   (2012-01-14 11:37:00) [6]

спросонья проглядел s:=''; Stream.Read(s, Length(s));- это, конечно, сильно :)

Если файл большой (очень даже бывают этак гигов 30-50), то stringlist идёт лесом, остаётся assign/reset или tfilestream/treader


Dimka Maslov   (2012-01-14 11:37:00) [7]


> А на учебники и хелп просто плюём! Так?


У нас эпидемия.


Германн   (2012-01-14 05:59:00) [8]


> e+e|e   (13.01.12 16:44) [8]
>
>
> > Dimka Maslov ©   (13.01.12 16:39) [6]
> >
> > Кто мешает прочесть текстовый файл ТСтрингЛистом и взять
> > св-во Текст?
>
>
> мы легкий путей не ищем!!!
>
>
> > RWolf ©   (13.01.12 16:30) [3]
> >
> > строка s до выполнения этого цикла, конечно же пустая?
>
> >
>
>
> а какая должна быть??? мы ж в нее считываем строку из файла!
> !!
> s:= '';
>

А на учебники и хелп просто плюём! Так?


Dimka Maslov   (2012-01-13 19:57:00) [9]


> а какая должна быть??? мы ж в нее считываем строку из файла!!!


Йа плакалъ...


Cobalt   (2012-01-13 17:52:00) [10]

Если это текстовый файл, то читай TStringlist
или через Assign/Reset/ReadLn while not EOF
А если читаешь не TStringlist - значит или у тебя там не чистый текст, или ты читатель журнала "Хакер".


DVM   (2012-01-13 16:48:00) [11]


> e+e|e   (13.01.12 16:26) [2]
> и что??? виснет же!!!
>
> while Stream.position < Stream.size do
>    begin
>      Stream.Read(s, Length(s));
>
>    end;
>
>

Как то так


var
 Reader: TReader;

Reader := TReader.Create(Stream, 1024);;
try
 while Stream.position < Stream.size do
    s := Reader.ReadString;
finally
 Reader.Free;
end;


RWolf   (2012-01-13 16:47:00) [12]


> мы ж в нее считываем строку из файла!!!

не строку из файла, а заданное количество байт из потока.
вопрос: сколько байт мы читаем, если > s:= '';?


e+e|e   (2012-01-13 16:44:00) [13]


> Dimka Maslov ©   (13.01.12 16:39) [6]
>
> Кто мешает прочесть текстовый файл ТСтрингЛистом и взять
> св-во Текст?


мы легкий путей не ищем!!!


> RWolf ©   (13.01.12 16:30) [3]
>
> строка s до выполнения этого цикла, конечно же пустая?
>


а какая должна быть??? мы ж в нее считываем строку из файла!!!
s:= '';


Сергей М.   (2012-01-13 16:41:00) [14]


> Dimka Maslov ©   (13.01.12 16:39) [6]


Некошерно)


Dimka Maslov   (2012-01-13 16:39:00) [15]

Кто мешает прочесть текстовый файл ТСтрингЛистом и взять св-во Текст?


Ega23   (2012-01-13 16:34:00) [16]


> и что??? виснет же!!!


Примите Виагру. Соковня.


Cobalt   (2012-01-13 16:34:00) [17]

Прекрасный образец для орешника :-)


RWolf   (2012-01-13 16:30:00) [18]

строка s до выполнения этого цикла, конечно же пустая?


e+e|e   (2012-01-13 16:26:00) [19]

и что??? виснет же!!!

while Stream.position < Stream.size do
   begin
     Stream.Read(s, Length(s));

   end;


Ega23   (2012-01-13 15:41:00) [20]

while position < size do


Наверх

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