Главная страница
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.037 c
3-1082619778
ИМХО
2004-04-22 11:42
2004.05.16
Эспорт в Access


1-1083529948
KEBZ
2004-05-03 00:32
2004.05.16
Text


8-1077192989
fiction
2004-02-19 15:16
2004.05.16
работа с графическим буфером


7-1080671449
Kme
2004-03-30 22:30
2004.05.16
Запрет на использование джойстика


6-1080137901
Rust
2004-03-24 17:18
2004.05.16
ServerSocket & ClientSocket