Есть текстовик, там названия книг, авторы, и количество страниц. Надо загрузить данные из текстовика в массив записей. Идея такая, сохраняю файл в переменную c типом ShortString бегу по текстовику и когда будет пробел, тогда идёт другое свойство записи ( Например, после автора шло название книги) Почти это реализовал, но застрял на моменте, как я буду брать строку для сохранения автора/название книги. Просто написать как у меня есть A[d].Author:= A[d].Author + output[c] ? Мне просто кажется это как-то всё через костыли, может я что-то не так делаю? Код записи:
TBook = record
Pages: integer;
Title: ShortString;
Author: ShortString;
end;
Код функции загрузки из файла в массив записей
procedure TForm1.LoadBtn1Click(Sender: TObject);
var output: ShortString;
begin
assignfile(LoadF, 'LoadF.txt');
Reset(LoadF);
for d:=0 to Length(A) - 1 do
begin
Read(LoadF, output);
for c:=0 to Length(output) do
begin
if (output[c] = ' ') then count:= count + 1;
if (count = 1) then A[d].Author :=
end;
Read(LoadF, A[d].Author);
end;
Kezzya, вообще тут на моё усмотрение, может лучше сделать после цифр точку с запятой, и если есть буква после точки с запятой в тексте, то можно выделить память Length(A) + 1...
procedure TMainForm.ButtonClick(Sender: TObject);
var
men: TMatchCollectionEnumerator;
begin
men := TRegEx.Matches('one two three', '\w+').GetEnumerator;
while men.MoveNext do
begin
men.Current.Value
end;
men.Free;
end;
Смекнули?
Units
- System.RegularExpressions
- System.Generics.Collections
TBook = package record
Pages: integer;
Title: string[255];
Author: string[255];
end;
...
var Item: TBook;
begin
while not Eof(LoadF) do
begin
Read(LoadF, Item);
SetLength(MyBooks, Length(MyBooks)+1);
MyBooks[Length(MyBooks)-1] := Item;
end;
...
Записи с точным размером ты можешь без проблем записывать напрямую в файл и читать.
НО!
Этот способ слишком низкоуровневый, малопроизводительный и вообще не стоит такое использовать.
Для этого используют файловые бд или современные форматы хранения данных. Например JSON или XML.
Я сначала похоже хотел, но у меня здесь "Illegal type in Read/Readln statement" опять выскакивает, где строчка Read(LoadF, Item);. Думал, значит так нельзя. Может вы знаете в чём проблема?
Нет. Читать можно так только если вы его так же и сохранили. А если у вас лишь текстовый файл как исходные данные, то вам выше уже написали парсер через регулярные выражения.
Это понятно, но сколько надо прибавить? У меня в программе я потом эти все записи должен буду сохранить в другой файл, значит придётся пробежаться по всему массиву.
..
type
TAppender<T> = class
class procedure Append(var Arr: TArray<T>; Value: T);
end;
..
{ TAppender<T> }
class procedure TAppender<T>.Append(var Arr: TArray<T>; Value: T);
begin
SetLength(Arr, Length(Arr)+1);
Arr[High(Arr)] := Value;
end;
...
procedure TMainForm.ButtonClick(Sender: TObject);
var
men: TMatchCollectionEnumerator;
a: TArray<string>;
begin
men := TRegEx.Matches('one two three', '\w+').GetEnumerator;
while men.MoveNext do
begin
TAppender<string>.Append(a, men.Current.Value);
end;
men.Free;
end;