Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2011, 08:24   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
поэтому я и просил хоть обрывок
Лчшее что тебе сказали это пост №6.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.01.2011, 09:14   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

согласен, через TStringList наиболее просто и, скорее всего не медленее, чем через TFileStream...
А вот чтение/запись построчно, я уверен, будет медленее, чем вышеупомянутые методы. Эти методы являются устаревшими и, в основном, оставлены для обратной совместимости.

поэтому код просто для ознакомления и саморазвития (а не для использования!):
Код:
var f1, f2 : TextFile;
   s : string;
   i : integer;
begin
   {Открываем входной файл}
   AssignFile(f1,'Инпут1.txt');
   Reset(f1);

   {перезаписываем выходной файл}
   AssignFile(f2,'Аутпут2.txt');
   Reset(f2);
 
   i:=0;
   {пропускаем первые 2000 строк}
   while (Not Eof(f1)) and (i<2000)  do begin
      Readln(f1,s); {прочитаем очередную строчку из входного файла} 
      inc(i); {увеличиваем счётчик строк}
   end;
   
   {оставшиеся строки переписываем в выходной файл }
   while Not Eof(f1) do begin
      Readln(f1,s); {прочитаем очередную строчку из входного файла} 
      Writeln(f2,s);
   end;
   
   {Закрываем файлы}
   CloseFile(f1);
   CloseFile(f2);

end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.01.2011, 09:49   #13
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Стринглист в этой задаче как корове седло.
Нет никакой гарантии что файл будет целиком в него загружен - при определенном состоянии кучи и достаточно большом размере файла обязательно возникнет исключение.

Решение - в использовании файловых потоков, заточеных под работу со строковыми данными.
mss вне форума Ответить с цитированием
Старый 27.01.2011, 10:55   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от mss
Нет никакой гарантии что файл будет целиком в него загружен - при определенном состоянии кучи и достаточно большом размере файла обязательно возникнет исключение.
Абсолютно не согласен!
За "очень" многолетний опыт использования - ни разу такого не было.
Другое дело, что огромный файл может грузиться ну о-о-о-очень долго! Это да!
А с памятью - винда, при необходимости, начнёт откусывать от виртуальной памяти (файла подкачки)... Ну, разумеется, если текстовый файл размером гига 4 (или на диске места свободного нет, или размер виртуальной памяти ограничен или ...) , то при определённых условиях с чтением такого файла будут проблемы...
Но мы же говорим про нормальные текстовые файлы!

Кстати, можете продемонстрировать это Ваше утверждение на конкретном примере?!


Цитата:
Сообщение от mss
в использовании файловых потоков, заточеных под работу со строковыми данными.
а можно чуть-чуть поподробнее?...
какие потоки заточены под работу со строками?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.01.2011, 12:21   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А с памятью - винда, при необходимости, начнёт откусывать от виртуальной памяти (файла подкачки)... Ну, разумеется, если текстовый файл размером гига 4 (или на диске места свободного нет, или размер виртуальной памяти ограничен или ...) , то при определённых условиях с чтением такого файла будут проблемы...
двух гигов достаточно, а может и одного хватить, в зависимости от раздробленности адресного пространства.
Цитата:
Но мы же говорим про нормальные текстовые файлы!
логи тоже текстовики
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.01.2011, 12:36   #16
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Только не стринглисты, я вас прошу.

1) Мапим очередной гигабайт из файла в память
2) Сканируем память, подсчитываем количество символов перевода строки
3) Насчитали 30000? Если нет, то шаг 1, иначе шаг 4
4) В цикле погигабайтно скидываем остатки файла из памяти в новый файл.
5) Стоп машина.

Почему погигабайтно? Ну обычно гиг нам видна выдаст. А больше не надо. Если не выдаст, заменить гиг на полгига. Если и полгига не выдаст, заменить комп.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.01.2011, 13:46   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Delphi Example

Код:
var
  F1, F2: TextFile;
  Ch: Char;
begin
  if OpenDialog1.Execute then begin
    AssignFile(F1, OpenDialog1.Filename);
    Reset(F1);
    if SaveDialog1.Execute then begin
      AssignFile(F2, SaveDialog1.Filename);
      Rewrite(F2);
      while not Eof(F1) do
      begin
        Read(F1, Ch);
        Write(F2, Ch);
      end;
      CloseFile(F2);
    end;
    CloseFile(F1);
  end;

end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 27.01.2011, 14:19   #18
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Ещё один вопрос: - насколько большой размер файла?.
Я с помощью того же стринглиста создал файл в 50000 строк, потом загрузил в другой стринглист этот файл. Загрузка произошла менее чем за 1сек.(если точнее 31 мс). а удаление первых 20000 строк за 1,2сек. вроде не так уж и долго. Можно конечно использовать memorystream или filestream
и считывать кусками в какой нибудь буфер, НО нужно будет подсчитывать сколько раз встретилось переходов на новую строку и т.д. а это уже получается геморойный алгоритм. Хотя это только моё предположение
приведу пример создания загрузки и удаления строк через стринглист
1. создание файла в 50000 строк
Код:
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
    sl:tstringlist;
begin
 sl:=tstringlist.Create;
for I := 1 to 50000 do
 sl.Add('Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms '+inttostr(i));
 sl.SaveToFile('d:\3.txt');
 sl.Free;
end;
2. Загрузка удаление и сохранение в другой файл
Код:
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
    sl:tstringlist;
    t1,t2:longint;
begin
 sl:=tstringlist.Create;
 t1:=GetTickCount;
 sl.LoadFromFile('d:\3.txt');
 t2:=GetTickCount;
 showmessage('загружен за '+inttostr(t2-t1)+ ' мсек.');
 t1:=GetTickCount;
 while sl.Count > 30000 do
  sl.Delete(0);
 t2:=GetTickCount;
 showmessage('удалены 20000 строк за '+inttostr(t2-t1)+ ' мсек.');
 sl.SaveToFile('d:\4.txt');
 sl.Free;
end;
SERG1980 вне форума Ответить с цитированием
Старый 27.01.2011, 14:52   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
while sl.Count > 30000 do
  sl.Delete(0);
лень (нет времени) проверять,
но, имхо, если вместо удаления,
Вы создадите НОВЫЙ (ещё один) объект TStringlist и банально перепишете туда оставшиеся строчки:
Код:
 sl2 :=  tstringlist.Create;
 for i:=30000 to sl.Count-1 do
    sl2.Append(sl.strings[i]);
 sl2.SaveToFile('d:\4.txt');
то это будет быстрее!
это раз.

А второе, а почему Вы берёте конечные тики до сохранения файла?!
Время сохранения результирующего файла тоже надо учитывать!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.01.2011, 15:03   #20
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Код:
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
    sl,sl2:tstringlist;
    t1,t2:longint;
begin
 sl:=tstringlist.Create;
  sl2:=tstringlist.Create;
 t1:=GetTickCount;
 sl.LoadFromFile('d:\3.txt');
 t2:=GetTickCount;
 showmessage('загружен за '+inttostr(t2-t1)+ 'мсек.');
 t1:=GetTickCount;
for i:=20000 to sl.Count-1 do
    sl2.Append(sl.strings[i]);
 sl2.SaveToFile('d:\4.txt');
 t2:=GetTickCount;
 showmessage('удалены 20000 строк за '+inttostr(t2-t1)+ ' мсек.');
 sl.Free;
 sl2.Free;
end;
да так на много быстрее, удаление + сохранение 65мс
Просто я автору хочу сказать что в его случае не стоит усложнять себе жизнь и делать через стринглист

Последний раз редактировалось SERG1980; 27.01.2011 в 15:05.
SERG1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Развернуть наизнанку изображение на экране (каким образом такое возможно) Synthesis Общие вопросы C/C++ 3 31.03.2010 19:09
Каким образом процессор обращается к портам Ivan_32 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 30.07.2009 12:29
Возможно ли удалить, вырезать, определенную строку в TMemo Des Компоненты Delphi 2 28.04.2009 16:21
ссылка через определенное количество строк chaostt Microsoft Office Excel 7 03.04.2009 18:14
Каким образом скопировать файл? Kashp Общие вопросы Delphi 14 07.08.2007 11:44