Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизИзменение одной строки в файле Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c