Форум: "Начинающим";
Текущий архив: 2012.05.13;
Скачать: [xml.tar.bz2];
Внизeof tfilestream Найти похожие ветки
← →
e+e|e (2012-01-13 15:32) [0]читаю текстовый файл tfilestreamом, где
у него аналог:
while not eof (f) do???
← →
Ega23 © (2012-01-13 15:41) [1]
while position < size do
← →
e+e|e (2012-01-13 16:26) [2]и что??? виснет же!!!
while Stream.position < Stream.size do
begin
Stream.Read(s, Length(s));
end;
← →
RWolf © (2012-01-13 16:30) [3]строка s до выполнения этого цикла, конечно же пустая?
← →
Cobalt © (2012-01-13 16:34) [4]Прекрасный образец для орешника :-)
← →
Ega23 © (2012-01-13 16:34) [5]
> и что??? виснет же!!!
Примите Виагру. Соковня.
← →
Dimka Maslov © (2012-01-13 16:39) [6]Кто мешает прочесть текстовый файл ТСтрингЛистом и взять св-во Текст?
← →
Сергей М. © (2012-01-13 16:41) [7]
> Dimka Maslov © (13.01.12 16:39) [6]
Некошерно)
← →
e+e|e (2012-01-13 16:44) [8]
> Dimka Maslov © (13.01.12 16:39) [6]
>
> Кто мешает прочесть текстовый файл ТСтрингЛистом и взять
> св-во Текст?
мы легкий путей не ищем!!!
> RWolf © (13.01.12 16:30) [3]
>
> строка s до выполнения этого цикла, конечно же пустая?
>
а какая должна быть??? мы ж в нее считываем строку из файла!!!
s:= "";
← →
RWolf © (2012-01-13 16:47) [9]
> мы ж в нее считываем строку из файла!!!
не строку из файла, а заданное количество байт из потока.
вопрос: сколько байт мы читаем, если > s:= ""; ?
← →
DVM © (2012-01-13 16:48) [10]
> 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;
← →
Cobalt © (2012-01-13 17:52) [11]Если это текстовый файл, то читай TStringlist
или черезAssign/Reset/ReadLn while not EOF
А если читаешь не TStringlist - значит или у тебя там не чистый текст, или ты читатель журнала "Хакер".
← →
Dimka Maslov © (2012-01-13 19:57) [12]
> а какая должна быть??? мы ж в нее считываем строку из файла!!!
Йа плакалъ...
← →
Германн © (2012-01-14 05:59) [13]
> 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-14 11:37) [14]
> А на учебники и хелп просто плюём! Так?
У нас эпидемия.
← →
megavoid © (2012-01-14 11:37) [15]спросонья проглядел
s:=""; Stream.Read(s, Length(s));
- это, конечно, сильно :)
Если файл большой (очень даже бывают этак гигов 30-50), то stringlist идёт лесом, остаётся assign/reset или tfilestream/treader
← →
DVM © (2012-01-14 14:55) [16]c TReader только надо иметь в виду, что первыми 4 байтами он считает длину строки, а потом уже столько байт в строку, сколько он считал в первый раз.
Т.е. если это просто текстовый файл, то нужно менять логику TReader или использовать что-то другое.
← →
megavoid © (2012-01-14 16:48) [17]мне вот именно с большими (и ещё больше, до 100-200 гб бывают у меня файлы) интересно кто как делает, можно ещё через CreateFileMapping с фреймом, и внутри фрейма #10 считать (и из винды, и из *никс бывают файлы) и разбивать на строки, но по скорости этот метод сравним с assign/readln, то есть в любом случае упираемся в скорость чтения с винта :(
← →
Anatoly Podgoretsky © (2012-01-14 17:03) [18]А если из Мака, то вообще нет #10 , но FileMapping в данном случае самый быстрый способ, но 200 гб при средней менее 50 мб, только на чтение потребуется более часа, а у автора бесконечность.
← →
megavoid © (2012-01-14 17:30) [19]среднюю чтения я поднимаю, вытаскивая читаемый файл на отдельный физический винт, получается около 70 мб/с
хочу сделать нечто наподобие нтфса, хранить в сжатом виде (до 60% убирается), читать сжатое, в памяти разжимать в строки и уже там считать переводы строк, надо только сперва потестить, будет ли смысл в приросте скорости, и будет ли он вообще
← →
megavoid © (2012-01-14 18:36) [20]а да, > 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
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.05.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.002 c