![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение определенной строки в txt файле. [D7]
Андрей Пл © (2007-09-03 10:15:00)Мне нужно изменить определенную строку в текстовом файле, только вот не пойму как это сделать! Как заполнить новый файл я знаю, как добавить в конец существующего тоже понятно:
assignFile(varFile, fileReport);
if not FileExists(fileReport) then
rewrite(varFile)
else
Append(varFile);
. . . . . . . . .
Writeln(varFile, str);
А как изменить в существующем файле например вторую строку???
Заранее спасибо.
Anatoly Podgoretsky (2007-09-08 13:20:00) [1]
> И что же это за такие кристально чистые прокси сервера с
> ниразу не чищенными логами, посоветуйте ;)
Не тупи и не коси под дурачка.
grisme (2007-09-08 04:28:00) [2]
> где такие файлы(350 мб) открываются?
тоталовский ЛистВьюер открывает файлы любого размера - он считывает их по небольшим кусочкам. HIEW так же, вроде бы, делает. Ну уйма еще примеров.
Dib@zol (2007-09-07 21:51:00) [3]И что же это за такие кристально чистые прокси сервера с ниразу не чищенными логами, посоветуйте ;)
Anatoly Podgoretsky (2007-09-07 21:46:00) [4]> Denis_ (07.09.2007 19:38:09) [9]
Логи прокси сервера, логи доступа к веб серверу и т.д.
Максимальный размер лога был 800 мб.
Denis_ (2007-09-07 19:38:00) [5]
> Война и мир и та в пару-тройку мегов текста и то упишется.
Значит, "Война и мир" 150 раз скопировано и вставлено.Возникает вопрос к уважаемому Анатолию, где такие файлы(350 мб) открываются?
Dib@zol (2007-09-07 16:04:00) [6]> Тебя что то смущает?
Базы данных в текстовом файле - явный моветон. Файловые архивы - тоже. Так где же такие монстры (брррр...) встречаются? Что-то я не могу себе вообразить. Война и мир и та в пару-тройку мегов текста и то упишется.
mrBOFH (2007-09-07 15:40:00) [7]Мне нужно изменить определенную строку в текстовом файле, только вот не пойму как это сделать! Как заполнить новый файл я знаю, как добавить в конец существующего тоже понятно:
Ответ:
никак, стандартные файловые системы не позволяют уменшить размер файла без перезаписи, можно обойтись без перезаписи только в двух случаях, если новая вторая строчка будет меньше или равна количеству символов старой.
тогда свой файл таким макаром
Var
FileNameRead : TextFile;// открываеш только для чтения
F : file of byte; //допускается FileName : File; при определенных директивах компиля
файло открывеш reset(f); //без параметров
в первом варианте открытого файла считываеш количество символов второй строчки, обрабатываеш строчку слующим образом:
ReadLn(F,S); считываем строчку
предполагаем что 1 строка="Задачка", вторая="111"
забиваеш новою строчку,добавляеш#10#13,а остальное забиваеш нулями или FF. Тоесть мы преобразовали строчку без нарушения структуры, получили строку вида S='111'+#10#13#0#0. Далее пишем в файл.
seek() - выставляеш позицию начало второй строки, в байтном варианте
For I:= 1 to Length(S) do
Begin
B:=Ord(S[I]);// B : Byte
Write(F,B);
End;
опосля не забываем вторую копию открытого файла закрыть FileClose(F);Еще очень большой плюс, что не надо каждый раз посля изменений перечитывать строки с начала, файл все-равно изменяеться.
Будет что-то непонятно пишы на mail, а то я проездом на сайте. Хотя респект сайту, видел много настоящих мастеров и интересных решений, может зарегаюсь
Anatoly Podgoretsky (2007-09-03 14:47:00) [8]> Denis_ (03.09.2007 14:38:05) [5]
Тебя что то смущает?
Denis_ (2007-09-03 14:38:00) [9]
> чтоб вам попался файл в 350 мегабайт.
текстовый?:D
DiamondShark (2007-09-03 14:29:00) [10]
> Сергей М. © (03.09.07 10:24) [1]
> Пользователь00005 (03.09.07 10:27) [2]
чтоб вам попался файл в 350 мегабайт.
Denis_ (2007-09-03 11:13:00) [11]можно построчно читать, записывая в др. файл. нужную строку заменить.Файл1 удалить, Файл2 переименовать. так я делал на turbo pascal 7
Пользователь00005 (2007-09-03 10:27:00) [12]var
someStringList : TStringList;
begin
someStringList := TStringList.Create;
someStringList.LoadFromFile(fileReport);
someStringList[<номер строки>] := 'Новое содержимое n-й строки';
someStringList.SaveToFile(fileReport);
someStringList.Free;
end;
Сергей М. (2007-09-03 10:24:00) [13]Для сравнительно небольшого файла:
with TStringList.Create;
try
LoadFromFile(fileReport);
Strings[1] := 'Новое содержимое 2-й строки';
SaveToFile(fileReport);
finally
Free;
end;