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

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

Большие *.тхт [D7, XP]


Данил.Ялта ©   (2006-12-12 08:18:00) 

У меня есть текстовый файл, размером не больше 10 мегабайт. Помогите нормально реализовать три функции:
1) получить из этого файла строку символов, начинающуюся с i и длиной L (
L<5000)
2) вырезать из этого файла какой то участок
3) вставить в каком нибудь месте файла кусок текста
==
Помогите, потому что единственное, что мне приходит в голову, это весь file читать в array of char


Игорь Шевченко   (2006-12-12 13:17:00) [1]

AndreyRu   (12.12.06 13:02) [16]

Где бы взять столько времени...


AndreyRu   (2006-12-12 13:02:00) [2]

Реализуй чтение файла старым добрым способом!
....
....
private
 a : array of string;

....
....

var
 f : TextFile;
 FSize, i : Cardinal;
 tmp : string;
begin
 AssignFile(f, FileName); //FileName - Имя твоего могучего файла
 Reset(f);
 fSize := FileSize(f); //Размер файла
 while not Eof(f) do
   begin
     ReadLn(f, tmp);
     SetLength(a, Length(a)+1); //величиваем размерность массива на 1
     a[Length(a)-1] := tmp;
   end;
 CloseFile(f);
 //Все массив строк получили теперьможно над ними работать.


> 1) получить из этого файла строку символов, начинающуюся
> с i и длиной L (
> L<5000)
> 2) вырезать из этого файла какой то участок
> 3) вставить в каком нибудь месте файла кусок текста


1) Для копирования части строки предусмотренна функция Copy
   Copy(Строка, Начало, Длинна);
   s := a[n]; //n-Номер строки
   i := 5; //Номер символа с которого начинается наша строка
   l := 20; //Длинна нашей строки;
   Res := copy(s, i, l); //Все переменная Res содержит нужный кусок строки.

2) Для вырезки куска строки есть процедура Delete
   Delete(Строка, Начало, Длинна);
   i := 5; //Номер символа с которого начинаем вырезать
   l := 20; //Длинна
   a[n]; //Строка нашего массива, где n-Номер строки
   Delete(a[n], i, l);

3) s := a[n]; //n-Номер строки
   i := 5; //Номер символа с которого начинается вставка промежуточного текста.
   Res := copy(s, 1, i) + 'ЛЮБОЙ ТЕКСТ' + copy(s, i+1, Length(s));
   a[n] := Res; //Все строка обновленна

Сохраняем обратно
var
 f : TextFile;
 s : string;
 i : integer;
begin
 AssignFile(f, FileName); //FileName - Имя файла в который сохраняем
 Rewrite(f);
 for i := 0 to Length(a)-1 do
   begin
     s := a[i];
     WriteLn(f, s);
   end;
 CloseFile(f);
end;

Все..


MetalFan   (2006-12-12 12:26:00) [3]

зачем невидимый TListBox??? чем StringList не угодил?


Игорь Шевченко   (2006-12-12 12:21:00) [4]

Gydvin ©   (12.12.06 11:50) [13]

Типа ответ в стиле delphimaster


Gydvin   (2006-12-12 11:50:00) [5]


> Игорь Шевченко ©   (12.12.06 11:20) [10]

Типа шутка? )))


Игорь Шевченко   (2006-12-12 11:26:00) [6]

Dmitrij_K   (12.12.06 11:24) [11]

Это не для начинающих


Dmitrij_K   (2006-12-12 11:24:00) [7]


> Игорь Шевченко ©   (12.12.06 11:20) [10]
> Единственный метод чтения текстовых файлов в Delphi, это
> загрузка их в TListBox. Если визуализация не нужна - в невидимый
> TListBox

Не единственный, еще есть Tmemo, Trichedit. Еще можно установить на компьютер MS Word и грузить с помощью TWordApplication+TWordDocument
:)


Игорь Шевченко   (2006-12-12 11:20:00) [8]

Думкин ©   (12.12.06 11:09) [9]

Единственный метод чтения текстовых файлов в Delphi, это загрузка их в TListBox. Если визуализация не нужна - в невидимый TListBox


Думкин   (2006-12-12 11:09:00) [9]


> Игорь Шевченко ©   (12.12.06 10:58) [7]

? Кто-то говорил о визуализации? Чем TStringList не устраивает?

Насоветуют...


Dmitrij_K   (2006-12-12 11:04:00) [10]


> размером не больше 10 мегабайт

TStringList нормально с этим справиться.


Игорь Шевченко   (2006-12-12 10:58:00) [11]

Грузить в TListBox и не париться. Все равно в Delphi других методов чтения текстовых файлов нету.

Насоветуют...


Barloggg   (2006-12-12 09:42:00) [12]

да, как массив букв с загрузкой поштучно это долго. это очень долго.
Нужно загружать как можно большим куском и уже в памяти проводить анализ. Тогда хорошо.

Так что либо уже указанный blockread куском в массив либо тоже уже указанный FileStream куском в массив.


Думкин   (2006-12-12 08:35:00) [13]


> Данил.Ялта   (12.12.06 08:21) [1]

Почему медленно? ты попробал, раз утверждаешь?


Думкин   (2006-12-12 08:26:00) [14]

Можно и обычный string - тянет в легкую. Единственно изменять надо аккуратно - тут могут и тормоза вылезти. Или TstringList.


Elen   (2006-12-12 08:24:00) [15]


> о если так делать, то из file of char очень медленно будут
> данные читаться :-(

Смотря как читать. Например BlockRead очень быстрая функция, а анализ содержимого уже в памяти проводи. Ну может еще подкачку придется делать


Данил.Ялта   (2006-12-12 08:21:00) [16]

Но если так делать, то из file of char очень медленно будут данные читаться :-(


Elen   (2006-12-12 08:21:00) [17]


>  это весь file читать в array of char

Лучше в TFileStream. Я правда не знаю потянет ли TListBox такие файлы, но можно и его попробвать.


Наверх

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