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

Вниз

Изменение одной строки в файле   Найти похожие ветки 

 
sergg ©   (2004-04-25 16:41) [0]

Уважаемые мастера!
Подскажите пожалуйста как можно изменить произвольную строку в текстовом файле?


 
begin...end ©   (2004-04-25 16:57) [1]

Можно использовать TStringList.

1. Прочитать файл (LoadFromFile).
2. Изменить нужную строку (Find, IndexOf).
3. Записать изменённый файл (SaveToFile).

Хотя, наверное, это не самое удачное решение.


 
sergg ©   (2004-04-25 17:02) [2]

Так вот мне тоже ж хочется обойтись без чтения и записи файла целиком :)) Сделать это как-то этак ;)))


 
uny   (2004-04-25 17:08) [3]

seek
функций такой, открываешь файл, потом seek, заменяешь и закрываешь


 
sergg ©   (2004-04-25 17:34) [4]

Это в смысле из TFileStream? а как тогда заменить?


 
begin...end ©   (2004-04-25 17:38) [5]

> uny   (25.04.04 17:08) [3]

И как Вы узнаете, по какому адресу (в байтах) расположена нужная строка?


 
testt   (2004-04-25 19:09) [6]

f : tstringlist; ( модуль classes )

f := tstringlist.create;
f.loadfromfile (paramstr(1)); // или имя файла

for i := 0 to f.count - 1 do
 begin
   // ищем строку по своим критериям
   f.strings[i] := stringreplace ...
end;

f.savetofile ("filename.txt");

Вот и все :)


 
Ultr ©   (2004-04-25 19:48) [7]

На байтовом уровне в текстовом файле строки разделяются друг от друга по сути парой подряд идущих цифр  13-10.

Загружаешь файл в память блоками(килов по 30) и сканируешь каждый блок на наличие данного сочетания. Соответственно какая по счету строка, столько сочетаний и нужно пропустить, после того как найдешь нужную строку, запоминаешь ее "seek", и сканируешь в этом же духе дальше - ищешь конец строки(попутно загружая в какой-нить буфер то что хошь получить из файла),  запоминаешь seek конца строки, после чего, запоминаешь размер полученных данных (seek2-seek1), получаешь измененный вариант того куска данных, измеряешь его размер (хотябы функцией (sizeof(); ), смещяешь все данные после второго seek в файле, на разницу размеров старого и нового блоков(тобишь той строки), и записываешь в "свободный" промежуток (между старым seek1 и новым seek2), и пожалуй все.

А не, еще надо СетФайлЭнд сместить на новый размер файла, если файл получился меньше прежнего.

По моему так будет само быстро...  

...но, конечно не само просто.  :))))))))))))))


 
Fay ©   (2004-04-25 21:10) [8]

2Ultr ©   (25.04.04 19:48) [7]
А если искомая строка "пересекает границу" 30-ти килов? Причём не одну?


 
sergg ©   (2004-04-26 11:01) [9]

Пасибо:)


 
Ultr ©   (2004-04-26 17:16) [10]

А кто сказал, что эти 30 килов - единственные, читай до конца файла (я имею введу что читать с жесткого диска надо поблочно - так быстрее гораздо)


 
Ultr ©   (2004-04-26 17:17) [11]

И к тому-же учти что размер файла может и не быть кратен 30 килам



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

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

Наверх




Память: 0.49 MB
Время: 0.039 c
6-1080647659
SAG
2004-03-30 15:54
2004.05.16
UDPSocket не получает сообщение


1-1083675213
Leos
2004-05-04 16:53
2004.05.16
TScrollBar


14-1082643926
Учащийся
2004-04-22 18:25
2004.05.16
Локализация программы


14-1082836228
RealRascal
2004-04-24 23:50
2004.05.16
Часов пять сидел за компом без перерыва...


1-1083210878
Inc.
2004-04-29 07:54
2004.05.16
Форма?