PDA

Просмотр полной версии : текст в файл


supernewbie
25.08.2010, 07:37
Нашел только как из мемо в файл записывать.

А как скажем записать строки из массива? или просто стринг в файл?

var
m: TMemo;
frm:TForm;

procedure Init; //Вызывается при включении скрипта
begin
frm := TForm.Create(nil);
frm.Caption := '1';
frm.BorderStyle := bsSizeable;
frm.Position := poDesigned ;
frm.Width:=400;
frm.Height:=600;
m:=TMemo.Create(frm);
m.parent:=frm;
m.align:=alClient;
m.ReadOnly:=true;
m.ScrollBars:=ssBoth;
m.Lines.Add('2');
m.Lines.Add('3');

end;

procedure SaveToFile(prefix:string);
var name:string;
begin
name := prefix+'.txt';
m.Lines.SaveToFile(name);
end;


procedure Free; //Вызывается при выключении скрипта
begin
SaveToFile('4');
end;


//основная часть скрипта
begin

end.

J-Fobos
25.08.2010, 12:35
var
Stream:TFileStream;
s:string;

begin
try //пытаемся создать файл, но если такой существует то открываем его
Stream := TFileStream.Create('c:\test.dat', fmOpenReadWrite);
except
Stream := TFileStream.Create('c:\test.dat', fmCreate);
end;
Stream.Write(s,SizeOf(s));//запись в файл чего угодно
Stream.Read(s,SizeOf(s));//чтение с файла чего угодно
Stream.Free;//закрытие файла
end.

Это универсальный вариант, в файл можно будет писать все что угодно. Но он сложный - требует много внимания :)
Для простоты можно использовать стандартную возможность класса TSringList.SaveToFile();

supernewbie
25.08.2010, 21:20
че-то ошибку пишет на SizeOf

Breadfan
25.08.2010, 21:22
чето интуитивно чуйствую что не Sizeof (просто это в делфи так), а length(фс) :)

supernewbie
25.08.2010, 21:37
Ыы

Добавлено через 4 минуты
а как ему сказать чтобы он вторую строку читал?

Добавлено через 6 минут
как ему сказать чтобы он вписал в файл

1
2

alexteam
25.08.2010, 21:58
Stream.Write(s,SizeOf(s));//запись в файл чего угодно
Stream.Read(s,SizeOf(s));//чтение с файла чего угодно

фигу.
тут либо
1. пишем размер строки
2. пишем саму строку.

и
1. читаем размер
2. выделяем строке нужное кол-во памяти
3. читаем эту строку.

либо
s:string[размер];

supernewbie
25.08.2010, 22:00
пример пож

alexteam
25.08.2010, 22:06
шо примерно ?
если тебе тупо строки надо туда засовывать - tstringlist
и не мучай людей тут.

J-Fobos
25.08.2010, 22:14
Я на коленке писал :) На работе нету ни пакетхака, ни делфи, надо бы уже и там их поставить :D Спасибо alexteam за поправку :)


supernewbie, пример мой, обязательно с учетом замечаний alexteam и Breadfan. А чтоб перейти на другую строку надо вписать #10+#13. А еще, если просто цифры писать, то даже не надо заморачиватся с размером переменной string, а указать как тип integer.

Breadfan
25.08.2010, 22:15
Ну у меня когда-то работало такое чудо мысли:
var
MyFile: TStringList;
i:integer;
name, key:string;
Ready, Ready1:boolean;
const
MyFileName = 'c:\tst\myfile.txt';
procedure Init; //Вызывается при включении скрипта
begin
i:=0;
MyFile:=TStringList.Create;
try
MyFile.LoadFromFile(MyFileName);
except// если ошибка, не обращаем внимание
end;
end;
procedure Free; //Вызывается при выключении скрипта
begin
if MyFile<>nil then
begin
MyFile.SaveToFile(MyFileName); // сохраняем при завершении работы скрипта.
MyFile.Free; // освобождаем память
end;
end;
// чтение значения из переменной
function GetValue(ValName: string): string;
begin
result:=MyFile.Values[ValName];
end;
// запись переменной
procedure SetValue(ValName: string; Value: string);
begin
MyFile.Values[ValName]:=Value;
end;

begin

SetValue(name,((key))); //name - имя переменной (первое поле), (key) - значение
//выглядеть в фале строка будет так (при name='Var'; key:='123';
//
// Var=123
//
end;

end. - но: не создает файл при его отсутсвии (лень было, да и незачем), сохрание данных в файл происходит при ВЫКЛЮЧЕНИИ скрипта. Скрипт использовался для чтения каких-то там байт из пакета с сервера при входе в игру, ответа клиента (2 пакета) и сохранения этих данных в файл.

J-Fobos
25.08.2010, 22:22
Ну у меня когда-то работало такое чудо мысли:
var
MyFile: TStringList;
i:integer;
name, key:string;
Ready, Ready1:boolean;
const
MyFileName = 'c:\tst\myfile.txt';
procedure Init; //Вызывается при включении скрипта
begin
i:=0;
MyFile:=TStringList.Create;
try
MyFile.LoadFromFile(MyFileName);
except// если ошибка, не обращаем внимание
end;
end;
procedure Free; //Вызывается при выключении скрипта
begin
if MyFile<>nil then
begin
MyFile.SaveToFile(MyFileName); // сохраняем при завершении работы скрипта.
MyFile.Free; // освобождаем память
end;
end;
// чтение значения из переменной
function GetValue(ValName: string): string;
begin
result:=MyFile.Values[ValName];
end;
// запись переменной
procedure SetValue(ValName: string; Value: string);
begin
MyFile.Values[ValName]:=Value;
end;

begin
if fromclient and Ready1 then begin
key:=StrtoHex(pck[1]+pck[2]+pck[3]);
name:=('pck2 - '+inttostr(i));
SetValue(name,((key)));
Ready1:=False;
end;

if fromclient and Ready then begin
key:=StrtoHex(pck[1]+pck[2]+pck[3]);
name:=('pck1 - '+inttostr(i));
SetValue(name,((key)));
Ready:=False;
Ready1:=True;
end;

if fromserver and (pck[1]=#$0B) then begin
i:=i+1;//ReadD(220);
key:=StrToHex(pck[220]+pck[221]+pck[222]+pck[223]);//ReadD(220);
name:=('key - '+inttostr(i));
SetValue(name,((key)));
Ready:=True;
end;

end. - но: не создает файл при его отсутсвии (лень было, да и незачем), сохрание данных в файл происходит при ВЫКЛЮЧЕНИИ скрипта. Скрипт использовался для чтения каких-то там байт из пакета с сервера при входе в игру, ответа клиента (2 пакета) и сохранения этих данных в файл.
То что я и писал с самого начала :)
Для простоты можно использовать стандартную возможность класса TSringList.SaveToFile();

supernewbie
25.08.2010, 22:28
шо примерно ?
если тебе тупо строки надо туда засовывать - tstringlist
и не мучай людей тут.

var
Stream:TStringList;

procedure Init; //Вызывается при включении скрипта
begin
Stream[1]:='1';
Stream[2]:='2';
Stream[3]:='3';
Stream[4]:='4';
TStringList.SaveToFile('E:\1.txt');

end;

что тут не так?

J-Fobos
25.08.2010, 22:42
До того как использовать Stream[1]:='1'; надо создать класс Stream:=TStringList.Create;
А потом нельзя сразу пробовать изменить Stream[i] потому что их еще не существует, их надо либо загрузить из файла, либо добавить методом Add

Описание класса:
TStringList - полезный тип класса. Он чрезвычайно полезен для многих видов обработок списков. Элементы в строковом списке могут быть вставлены, перемещены и отсортированы.

Список может быть сформирован строка за строкой, или загружен из большой строки разделенной запятой или даже из текстового файла. TStringList происходит от TStrings. Вы можете использовать и TStrings, но это не рекомендуется, так как он не полный - некоторые из его методов абстрактны. TStringList осуществляет эти абстрактные методы (Clear, Delete и Insert). Мы рассмотрим основные свойства и методы TStringList, включая полученные из TStrings.

Свойство Count
Возвращает число строк в списке.

Свойство Capacity
Устанавливает или получает текущую вместимость строкового списка. Вы можете управлять этой вместимостью по необходимости.

Свойство Strings
Получает или корректирует строку по данному индексу в списке (первый элемент списка имеет индекс 0).

Обратите внимание, что свойство Strings является свойством, заданным по умолчанию. Это означает, что вы можете использовать его без его указания:

myName := names.Strings[4];

является эквивалентным:

myName := names[4];

Свойство Text
Устанавливает или получает список в виде большой строки. Эта строка будет содержать каждую строку закончивающуюся комбинацией символов перевода каретки и перевода строки (CRLF). Полезно для загрузки из визуального объекта, который может содержать многочисленные строки текста.

Свойство CommaText
Получает или устанавливает список в виде большой строки. Эта строка будет иметь список строк разделенных запятыми. Это полезно для загрузки из экспорта текстовой электронной таблицы. Если при получении строка содержит вложенные пространства, то она будет заключена в двойные кавычки.

Cвойство DelimitedText
Получает или устанавливает список через большую строку. Эта строка содержит список строк разделенных значением Delimiter (по умолчанию - запятая). Строки, содержащие вложенные пробелы должны быть заключены в QuoteChar (по умолчанию - ").

Свойство Values
Возвращает значение для данного названия, когда используются строки пары название/значение (см. выше).

Свойство ValueFromIndex
Возвращает значение по индексу строки (начинается с 0), когда используются пары название/значение.

Свойство CaseSensitive
Когда true, Delphi обрабатывает строки чувствительно к регистру при выполнении некоторых операций, таких как Sort.

Свойство Duplicates
Это свойство может иметь одно из следующих перечислимых TDuplicates значений:

dupIgnore Игнорирует (отбрасывает) дубликаты
dupAccept Позволяют дубликаты
dupError Выбрасывает исключение, если имеются дубликаты



Свойство Sorted
Когда true, все строки будут добавляться в свою позицию отсортированной последовательности. Когда false, они будут добавляться в конец. См. также метод Sort.

Свойство Objects
Возвращает объект, связанный со строкой по данному индексу, если он существует.

Метод Add
Добавляет данную строку в список, возвращая ее позицию в списке (начинается с 0).

Метод Append
Так же как и Add, но без возвращения индексного значения.

Метод Insert
Вставляет строку в заданную индексом позицию. Позиция 0 вызовет вставку в начало.

Метод Delete
Удаляет строку по данному индексу.

Метод Clear
Удаляет все строки из списка.

Метод Move
Перемещает строку из одной позиции в другую, сдвигая другие строки соответственно.

Метод Exchange
Перестанавливает две строки в списке, идентифицированные по их индексным позициям.

Метод IndexOf
Получает индекс позиции строки в списке соответствующей данной строке. Если строка не найдена, то возвращается -1.

Метод IndexOfName
Получает индекс позиция первой пары название/значение строки, где название соответствует данной строке. Если не найдена - возвращается -1.

Метод Find
То же самое, что и IndexOf, но с использованием списков сортированных строк.

Метод Sort
Если Sorted является ложным, то это вызовет сортировку списка.

Метод AddStrings
Добавляет строки из другого списка.

Метод Assign
Заменяет текущий список содержанием другого списка.

Метод LoadFromFile
Очень полезный метод, загружает строковый список из текстового файла. Каждая текстовая строка (законченая CRLF - см. DelimitedText) становится строкой списка.

Метод SaveToFile
Сохраняет строковый список в текстовый файл.
Для памятки всем :)
alexteam
Stream.SaveToFile('C:\'+FormatDateTime('yyyy_ mm_dd___hh-nn-ss',now)+'.txt');

Breadfan
26.08.2010, 05:45
вот вдогонку вчерашней(сегодняшней) дискуссии:
выкидывание пробелов из переменной и преобразование ее из string в integer (если там не число то вернется -1):
var
tst:string;
procedure Init; //Вызывается при включении скрипта
begin
tst:='12 3 a45 '; //переменная для теста
SendMsg('Стартовое значение переменной: '+tst);
SendMsg('Без пробелов: '+Noprobel(tst)); //выкидываем из tst все пробелы
//и вывод значения tst,
//если же в tst находится не число - возвращаемый результат=-1
SendMsg('Это число (если не число то -1).....'+Inttostr(number(Noprobel(tst))));
end;

function NoProbel(a:string):string;
var
b:string;
i:integer;
begin
b:='';
for i:=1 to (length(a)) do begin
if (Copy(a,i,1)<>' ') then b:=b+Copy(a,i,1);
end;
result:=b;
end;

function Number(a:string):integer;
begin
try result:=strtoint(a);
except result:=-1
end;
end;

procedure Free; //Вызывается при выключении скрипта
begin
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
end.PS: странное расположение вызова процедур\задания переменных - изза работы без клиента - пришлось вызовы в блок инит пихнуть.

mira
26.08.2010, 13:06
в фсе через стринглист наверна тока или перекомпилить пх добавив внешнюю функцию
тк с указателями фс вроде не дружит.
Для делфей сохранение в поток:
ps:pansichar
s:string
ps:=pansichar(s)
stream.write(ps^,length(ps))