Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменение определенной строки в 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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо