Главная страница
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.043 c
1-1083128507
din
2004-04-28 09:01
2004.05.16
Lookup в гриде


3-1082550944
Санёк
2004-04-21 16:35
2004.05.16
Поле типа TCurrencyField, как убрать рубли ?


1-1083561991
Ivolg
2004-05-03 09:26
2004.05.16
Компонента


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


4-1079983789
Ангел.
2004-03-22 22:29
2004.05.16
LoadAccelerators