Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.09;
Скачать: CL | DM;

Вниз

Запись и чтение в/из файл(-а)   Найти похожие ветки 

 
Elec3C ©   (2007-12-11 16:56) [0]

При запуске и завершении приложения мне нужно, как можно быстрее,
загружать/сохранять в файл некие текстовые данные. Какой способ посоветуете использовать?

P.S. Или всё-таки использовать паскалевкий: AssignFile, Reset... или через Streams?


 
Elec3C ©   (2007-12-11 18:22) [1]

Про файловые потоки.
Есть такое(не KOL"овское):

//записи/перезаписи файла
Procedure WriteFile(s, FileName:string);
begin
  with TFileStream.create(FileName, fmCreate or fmOpenWrite) do
    try
      write(pointer(s)^,length(s));
    finally
      free;
    end;
end;
//Чтение файла
var p : PChar;
begin
  GetMem(p, 255);

  with TFileStream.Create("c:\1.txt", fmOpenReadWrite) do
    try
      Seek(10,soFromBeginning);
      read(p^, 254);
    finally
      free;
    end;
 
    FreeMem(p);
end;

Как переписать их под KOL?


 
Дмитрий К ©   (2007-12-11 18:32) [2]

PStrList.LoadFromFile/SaveToFile


 
ANTPro ©   (2007-12-11 18:59) [3]

Или использовать PStream(примеры на сайте есть)


 
Andrey_rus   (2007-12-11 20:10) [4]

Зачем использовать обертки!
Используй WinAPI.
Чтение и запись файлов в нем элементарны.


 
Barloggg   (2007-12-12 09:22) [5]

открывать напрямую файловый поток это не быстро. а если работа идет с сетевого диска, так вообще убицца.

самый быстрый способ это создать NewMemoryStream. все записи сделать в него, а потом после всего сделать stream.savetofile и сбросить поток на диск одним махом.


 
Elec3C ©   (2007-12-12 13:32) [6]


> Barloggg

А если файл > 5 мб?


 
Dimaxx ©   (2007-12-12 13:47) [7]

//записи/перезаписи файла
Procedure WriteFile(s, FileName:string);
var F: PStream;
begin
 F:=NewWriteFileStream(FileName);
 F.Position:=F.Size;
 try
   F.WriteStrZ(s);
 finally
   F.Free;
 end;
end;


//Чтение файла
var
 s: string;
 F: PStream;
begin
 F:=NewReadFileStream("c:\1.txt");
 try
   F.Position:=10;
   F.ReadStrZ(S);
 finally
   F.Free;
 end;
end;


Это для случая, когда строки оканчиваются нулевым байтом. Если нужно завершать стандартно (#13#10), то так:

//записи/перезаписи файла
Procedure WriteFile(s, FileName:string);
var F: PStream;
    C: Char;
begin
 F:=NewWriteFileStream(FileName);
 F.Position:=F.Size;
 try
   F.WriteStr(s);
   C:=#13;
   F.Write(C,1);
   C:=#10;
   F.Write(C,1);
 finally
   F.Free;
 end;
end;


//Чтение файла
var
 s: string;
 F: PStream;
begin
 F:=NewReadFileStream("c:\1.txt");
 try
   F.Position:=10;
   F.ReadStr(S);
 finally
   F.Free;
 end;
end;


 
D[u]fa   (2007-12-12 14:26) [8]

есть функции StrLoadFromFile\StrSaveToFile


 
Barloggg   (2007-12-12 14:48) [9]


> Elec3C ©   (12.12.07 13:32) [6]
>
>
> > Barloggg
>
> А если файл > 5 мб?
>

да хоть сколько. оперативки у нас теперь много.
Я таким образом в одной программе сбрасывал на диск 50 мегабайтные битмапы компонуя их в памяти побайтно. запись на диск длилась много меньше чем создание и занимало полторы-три секунды. Так что можно.


 
Elec3C ©   (2007-12-12 16:38) [10]


> Dimaxx
> D[u]fa
> Barloggg

Всем спасибо.


 
Elec3C ©   (2007-12-12 20:29) [11]

Последняя просьба: Barloggg можешь привести примерчик по NewMemoryStream?


 
GMax   (2007-12-12 23:43) [12]

Filestream"овсеий ReadStr ну просто жутко медленный.
ну и запись по одному байту в стиле WriteStr(s); WriteStr(#13) будет существенно медленнее, чем WriteStr(S+#13)

с BufferedStream от Thaddy ускорение на порядок (или два, не помню уже)
если надо быстро, надо буферизовать обязательно. или хотя бы через memorystream


 
Elec3C ©   (2007-12-13 00:51) [13]


> GMax

А можно примерчик буфферизированой/го записи/чтения?


 
Barloggg   (2007-12-13 10:57) [14]


> Последняя просьба: Barloggg можешь привести примерчик по
> NewMemoryStream?


var strm:Pstream;

strm:=NewMemorystream;
...
запись в strm
...
strm.savetofile("filename",0,strm.position);
strm.free;


 
Elec3C ©   (2007-12-13 16:52) [15]


> Barloggg

Спасибо.


 
GMax   (2007-12-14 23:58) [16]

Elec3C, я не примерчик, я ссылку на www.thaddy.com дам :)
там есть KOLBufferedStream. правда в нем есть немного ошибок, Тэдди их так и не поправил, хотя я ему патч высылал, но для 5 мег файла сойдёт :)


 
GMax   (2007-12-15 00:04) [17]

нашел таки свой поправленный слегка вариант.
правда он все равно больне 4 гиг не понимает и с новыми колстримами на in64 не совместим, но переделывать неохота

http://www.terraspace.ru/gmax/progs/kolstreams.zip


 
Elec3C ©   (2007-12-15 13:12) [18]


> Elec3C, я не примерчик,

Я просил привести пример использования буфферизированой/го записи/чтения
файла, а не называл тебя "примерчиком"!!!


 
GMax   (2007-12-17 00:29) [19]

Elec3C не читатель, Elec3C писатель. умолкаю %)


 
ROMEO   (2008-11-27 15:04) [20]

СПАСИБА БОЛЬШОЕ ЗА ОТВЕТ НА ЗАПРОС ПО ДАННОЙ ТЕМЕ  . ЕСЛИ МОЖИТЕ НАПИШИТЕ ПОЖАЛУЙСТА ПРИМЕР ОПЕРАЦЫОННОЙ СИСТЕМЫ НА DELPHI ИЛИ ПРИМЕР ТАКОГО ПРИЛОЖЕНИЯ КОТОРОЕ ПОЗВОЛИТ КОПИРОВАТЬ ФАЙЛЫ DJVU  PDF В СТАРЫЙ WORD  ИЛИ ЖЕ ПРИМЕР КОДЕКОВ ДЛЯ ВИДЕО ПОД КОМПЬЮТЕР 98 - ГО ГОЛА ВЫПУСКА  (У КОТОРОГО ВИНТ НА 3  ГЕКТАРА ) И ЖЕЛАТЕЛЬНО ТОЖЕ НА DELPHI.


 
Palladin ©   (2008-11-27 15:30) [21]

называется, школьники-блондины в интернете...


 
Rouse_ ©   (2008-11-27 15:46) [22]

К сожалению не получиться... Пример не влезет в требуемый винт размером в 3 гектара, если прикупишь на парочку хардов для хранения примера каждый по семь терабайт, то тогда могу переслать его по почте :)


 
D[u]fa   (2008-11-27 17:11) [23]

Кого-то торкнуло и не отпускает....



Страницы: 1 вся ветка

Текущий архив: 2011.01.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.009 c
15-1285241479
oxffff
2010-09-23 15:31
2011.01.09
YAR и параметрический полиморфизм


4-1243760418
Nikfel
2009-05-31 13:00
2011.01.09
Как загрузить файл .res и из него брать ресурсы


11-1197381407
Elec3C
2007-12-11 16:56
2011.01.09
Запись и чтение в/из файл(-а)


2-1287047598
mfender
2010-10-14 13:13
2011.01.09
Запустить внешнюю программу и определить, что...


15-1284571785
МИхаил
2010-09-15 21:29
2011.01.09
Хранение вещественного в 2 целых числах, и операции с ним