Конференция "KOL" » Запись и чтение в/из файл(-а) [Delphi]
 
  • Elec3C © (11.12.07 16:56) [0]
    При запуске и завершении приложения мне нужно, как можно быстрее,
    загружать/сохранять в файл некие текстовые данные. Какой способ посоветуете использовать?

    P.S. Или всё-таки использовать паскалевкий: AssignFile, Reset... или через Streams?
  • Elec3C © (11.12.07 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?
  • Дмитрий К © (11.12.07 18:32) [2]
    PStrList.LoadFromFile/SaveToFile
  • ANTPro © (11.12.07 18:59) [3]
    Или использовать PStream(примеры на сайте есть)
  • Andrey_rus (11.12.07 20:10) [4]
    Зачем использовать обертки!
    Используй WinAPI.
    Чтение и запись файлов в нем элементарны.
  • Barloggg (12.12.07 09:22) [5]
    открывать напрямую файловый поток это не быстро. а если работа идет с сетевого диска, так вообще убицца.

    самый быстрый способ это создать NewMemoryStream. все записи сделать в него, а потом после всего сделать stream.savetofile и сбросить поток на диск одним махом.
  • Elec3C © (12.12.07 13:32) [6]

    > Barloggg

    А если файл > 5 мб?
  • Dimaxx © (12.12.07 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 (12.12.07 14:26) [8]
    есть функции StrLoadFromFile\StrSaveToFile
  • Barloggg (12.12.07 14:48) [9]

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

    да хоть сколько. оперативки у нас теперь много.
    Я таким образом в одной программе сбрасывал на диск 50 мегабайтные битмапы компонуя их в памяти побайтно. запись на диск длилась много меньше чем создание и занимало полторы-три секунды. Так что можно.
  • Elec3C © (12.12.07 16:38) [10]

    > Dimaxx
    > D[u]fa
    > Barloggg

    Всем спасибо.
  • Elec3C © (12.12.07 20:29) [11]
    Последняя просьба: Barloggg можешь привести примерчик по NewMemoryStream?
  • GMax (12.12.07 23:43) [12]
    Filestream'овсеий ReadStr ну просто жутко медленный.
    ну и запись по одному байту в стиле WriteStr(s); WriteStr(#13) будет существенно медленнее, чем WriteStr(S+#13)

    с BufferedStream от Thaddy ускорение на порядок (или два, не помню уже)
    если надо быстро, надо буферизовать обязательно. или хотя бы через memorystream
  • Elec3C © (13.12.07 00:51) [13]

    > GMax

    А можно примерчик буфферизированой/го записи/чтения?
  • Barloggg (13.12.07 10:57) [14]

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


    var strm:Pstream;

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

  • Elec3C © (13.12.07 16:52) [15]

    > Barloggg

    Спасибо.
  • GMax (14.12.07 23:58) [16]
    Elec3C, я не примерчик, я ссылку на www.thaddy.com дам :)
    там есть KOLBufferedStream. правда в нем есть немного ошибок, Тэдди их так и не поправил, хотя я ему патч высылал, но для 5 мег файла сойдёт :)
  • GMax (15.12.07 00:04) [17]
    нашел таки свой поправленный слегка вариант.
    правда он все равно больне 4 гиг не понимает и с новыми колстримами на in64 не совместим, но переделывать неохота

    http://www.terraspace.ru/gmax/progs/kolstreams.zip
  • Elec3C © (15.12.07 13:12) [18]

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

    Я просил привести пример использования буфферизированой/го записи/чтения
    файла, а не называл тебя "примерчиком"!!!
  • GMax (17.12.07 00:29) [19]
    Elec3C не читатель, Elec3C писатель. умолкаю %)
  • ROMEO (27.11.08 15:04) [20]
    СПАСИБА БОЛЬШОЕ ЗА ОТВЕТ НА ЗАПРОС ПО ДАННОЙ ТЕМЕ  . ЕСЛИ МОЖИТЕ НАПИШИТЕ ПОЖАЛУЙСТА ПРИМЕР ОПЕРАЦЫОННОЙ СИСТЕМЫ НА DELPHI ИЛИ ПРИМЕР ТАКОГО ПРИЛОЖЕНИЯ КОТОРОЕ ПОЗВОЛИТ КОПИРОВАТЬ ФАЙЛЫ DJVU  PDF В СТАРЫЙ WORD  ИЛИ ЖЕ ПРИМЕР КОДЕКОВ ДЛЯ ВИДЕО ПОД КОМПЬЮТЕР 98 - ГО ГОЛА ВЫПУСКА  (У КОТОРОГО ВИНТ НА 3  ГЕКТАРА ) И ЖЕЛАТЕЛЬНО ТОЖЕ НА DELPHI.
  • Palladin © (27.11.08 15:30) [21]
    называется, школьники-блондины в интернете...
  • Rouse_ © (27.11.08 15:46) [22]
    К сожалению не получиться... Пример не влезет в требуемый винт размером в 3 гектара, если прикупишь на парочку хардов для хранения примера каждый по семь терабайт, то тогда могу переслать его по почте :)
  • D[u]fa (27.11.08 17:11) [23]
    Кого-то торкнуло и не отпускает....
 
Конференция "KOL" » Запись и чтение в/из файл(-а) [Delphi]
Есть новые Нет новых   [134431   +15][b:0][p:0.002]