Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Запись в файл

Часто задаваемые вопросы
Post Reply
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Запись в файл

Post by Edred »

Тема восстановлена из кеша гугла. Если автор сможет повторить свой пост (в новой теме) - я этот удалю.
Запись в файл

Edred
Moderator

Joined: 28 Mar 2006
Posts: 654
Location: Saint-Petersburg
Posted: Tue May 01, 2007 1:41 Post subject:

--------------------------------------------------------------------------------

Это полезная вещь, надо ее в инклюды.

Back to top


id
Neophyte



Joined: 24 Dec 2006
Posts: 46

Posted: Fri May 04, 2007 8:59 Post subject:

--------------------------------------------------------------------------------

Вроде Стелс TStringList поддерживает еще.
Тогда еще вариант:
Code:
var
ts: TStringList;
begin
ts:=TStringList.Create();
ts.Text := текст; //или ts.Add(текст) построчно
ts.SaveToFile('путь');
ts.Free;
end;


Back to top


id
Neophyte



Joined: 24 Dec 2006
Posts: 46

Posted: Fri May 04, 2007 9:01 Post subject:

--------------------------------------------------------------------------------

Вспомнил, что в своих некоторых скриптах делал эту возможность и взял оттуда процедуру.
Code:
procedure WriteLog(mes: string);
begin
if not WriteToLog then exit;
with TStringList.Create do
begin
try
LoadFromFile(LogName);
Add(FormatDateTime('dd.mm.yyyy hh:mm:ss > ', Now) + mes);
SaveToFile(LogName);
finally
Free;
end;
end;
end;

WriteToLog - бул.
LogName - стринг.
Из конфига.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Запись в файл

Post by Vizit0r »

xmind wrote:

Code: Select all

procedure WriteToFile(filepath: string;   data: string); 
... 
изменил на

перезаписать содержимое файла

Code: Select all

procedure WriteToFile(filepath: string; data: string);
var mode: Word;
begin
if FileExists(filepath) then mode := fmOpenReadWrite
else mode := fmCreate;
with TFileStream.Create(filepath,mode) do
  try
    WriteBuffer(data,Length(data)*2);
  finally
    Free;
  end;
end;
добавить строку в файл

Code: Select all

procedure WriteToFile(filepath: string; data: string);
var mode: Word;
begin
if FileExists(filepath) then mode := fmOpenReadWrite
else mode := fmCreate;
with TFileStream.Create(filepath,mode) do
  try
    Seek(0,soFromEnd);
    WriteBuffer(data,Length(data)*2);
  finally
    Free;
  end;
end;
да, можно было это сделать параметром, но я решил не усложнять :)

xmind wrote:пример:
WriteToFile('C:\log.txt', 'hello world' + #13#10);
#13#10 - перевод строки
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
innominee
Neophyte
Neophyte
Posts: 23
Joined: 13.08.2011 0:36
Contact:

Re: Запись в файл

Post by innominee »

Есть вопрос. Юзаю инклюд Визитора, строка кода

Code: Select all

WriteToFile('E:\S\log.txt', 'Started ' +DateTimeToStr(Now)); 
Если дописываю перевод строки после SateTime.., то функция ругается на неверное число параметров. Но даже просто с символом перевода - в файл не дописываются строки, а просто заменяются. Т.е. в файле всегда одна строка =( Т.е. хочу узнать следующее : как использовать вставку времени\ника чара + символ перевода строки, и как сделать, что бы функция дописывала в файл, а не заменяла все в нем? Заранее спасибо за ответ
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Запись в файл

Post by Vizit0r »

копай в сторону Seek(0, soFromEnd);
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
innominee
Neophyte
Neophyte
Posts: 23
Joined: 13.08.2011 0:36
Contact:

Re: Запись в файл

Post by innominee »

Vizit0r wrote:копай в сторону Seek(0, soFromEnd);

Спасибо, помогла вставка строки перед WriteBuffer(data,Length(data));.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Запись в файл

Post by Vizit0r »

изменил свой пост с функциями
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Хреник
Novice
Novice
Posts: 70
Joined: 11.06.2008 20:33

Re: Запись в файл

Post by Хреник »

пример с добавлением строки в файл, вешает новый стелс 6.1.4 наглухо.

А точнее "Seek(0,soFromEnd);"
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Запись в файл

Post by Vizit0r »

1) Seek исправил, в апдейте будет работать.
2)изменил пример, потому что символы в строке теперь имеют по 2 байта - умножать длину надо на 2.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
GeeZeR
Apprentice
Apprentice
Posts: 226
Joined: 28.01.2012 19:48

Re: Запись в файл

Post by GeeZeR »

Подскажите, как добавить символ разрыва строки в WriteBuffer(data,Length(data)*2); чтобы каждая запись в примере начиналась с новой строки:

Code: Select all

procedure WriteToFile(path: string; data: string);
var mode: Word;
begin
	if FileExists(path) then begin
		mode := fmOpenReadWrite;
	end else begin
		mode := fmCreate;
	end;
	with TFileStream.Create(path,mode) do try
	    Seek(0,soFromEnd);
		WriteBuffer(data,Length(data)*2);
	finally
	    Free;
	end;
end;
Stealth 8.10.2 | Клиент: 7.0.13.4
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Запись в файл

Post by Vizit0r »

tempstr : String;

tempstr := data + #13 + #10;
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
GeeZeR
Apprentice
Apprentice
Posts: 226
Joined: 28.01.2012 19:48

Re: Запись в файл

Post by GeeZeR »

Не хочет так.

Code: Select all

procedure WriteToFile(path: string; data: string);
var mode: Word;
begin
	if FileExists(path) then begin
		mode := fmOpenReadWrite;
	end else begin
		mode := fmCreate;
	end;
	with TFileStream.Create(path,mode) do try
	    Seek(0,soFromEnd);
		WriteBuffer(data + #13 + #10, Length(data)*2);
	finally
	    Free;
	end;
end;
Writeln(data); чёт тоже не пашет.
Stealth 8.10.2 | Клиент: 7.0.13.4
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Запись в файл

Post by Vizit0r »

ты читал что я писал? Я не писал про "data + #13 + #10". Наверное неспроста я написал про новую переменную, да?
Причем, Length(data)*2 должно быть (Length(data)+2)*2.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
GeeZeR
Apprentice
Apprentice
Posts: 226
Joined: 28.01.2012 19:48

Re: Запись в файл

Post by GeeZeR »

Vizit0r wrote:ты читал что я писал? Я не писал про "data + #13 + #10". Наверное неспроста я написал про новую переменную, да?
Причем, Length(data)*2 должно быть (Length(data)+2)*2.
Растолкуй мне какая разница между:

Code: Select all

WriteBuffer(data + #13 + #10, Length(data)*2);
и

Code: Select all

tempstr := data + #13 + #10;
WriteBuffer(tempstr, Length(data)*2);
?
(Length(data)+2)*2
А про это ты написать забыл, да? :twisted:

Но оно всё равно не пашет, что я делаю не так?

Code: Select all

procedure WriteToFile(path: string; data: string);
var mode: Word;
tempstr : string;
begin
	if FileExists(path) then begin
		mode := fmOpenReadWrite;
	end else begin
		mode := fmCreate;
	end;
	with TFileStream.Create(path,mode) do try
		tempstr := data + #13 + #10;
	   Seek(0, soFromEnd);
		WriteBuffer(tempstr, (Length(data)*2)*2);
	finally
	   Free;
	end;
end;

WriteToFile(<путь>, 'test string');
ImageImage
Stealth 8.10.2 | Клиент: 7.0.13.4
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Запись в файл

Post by Vizit0r »

НУ ПЛЮС ЖЕ!
(Length(data)+2)

Code: Select all

Program prodaza_runok;

procedure WriteToFile(path: string; data: string);
var mode: Word;
tempstr : string;
begin
   if FileExists(path) then begin
      mode := fmOpenReadWrite;
   end else begin
      mode := fmCreate;
   end;
   with TFileStream.Create(path,mode) do 
   try
      tempstr := data + #13#10;
      Seek(0, soFromEnd);
      WriteBuffer(tempstr,(Length(data)+2)*2);
   finally
      Free;
   end;
end;


begin
WriteToFile('d:\Stealth\my\zzz.txt', 'test string');
end.
итог, в UTF-16

Code: Select all

test string
test string
test string
test string
test string
GeeZeR wrote: Растолкуй мне какая разница между:

Code: Select all

WriteBuffer(data + #13 + #10, Length(data)*2);
и

Code: Select all

tempstr := data + #13 + #10;
WriteBuffer(tempstr, Length(data)*2);
?
WriteBuffer первым параметром принимает переменную неопр. типа. Переменную, а не значение. А data + #13 + #10 это как раз и есть значение.

Кстати - возможно, в результате преоразований скрипт-код это значение и влетает в WriteBuffer как переменная. Впрочем, это уже ньюансы.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
GeeZeR
Apprentice
Apprentice
Posts: 226
Joined: 28.01.2012 19:48

Re: Запись в файл

Post by GeeZeR »

Да, моя невнимательность, спасибо заработало!
Stealth 8.10.2 | Клиент: 7.0.13.4
Post Reply