Главная страница
    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.46 MB
Время: 2.941 c
14-1083085514
MDT
2004-04-27 21:05
2004.05.16
Форум для специалистов по математической статистике


3-1082058087
mur
2004-04-15 23:41
2004.05.16
вместо букв - закорючки


6-1080208521
Valentin
2004-03-25 12:55
2004.05.16
нужен модуль


1-1083177631
killer
2004-04-28 22:40
2004.05.16
Кнопочка в StringGrid


3-1082704510
huyone
2004-04-23 11:15
2004.05.16
Индексировать файл Foxpro DBASE III из программы?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский