Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-1080560791
Gamlet
2004-03-29 15:46
2004.05.16
Вход в систему


14-1082838560
Thor
2004-04-25 00:29
2004.05.16
металлоискатели все стран....


3-1082402955
mur
2004-04-19 23:29
2004.05.16
# вместо русских букв в таблице в Database Desktop


1-1082965904
Victor_A
2004-04-26 11:51
2004.05.16
Как засунуть модуль .dll в .EXE и работать с ним от туда


6-1080543470
Sodom
2004-03-29 10:57
2004.05.16
Upload файла на сервер через PHP-скрипт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский