Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];




Вниз

Чтение записей из файла 


Lame1   (2002-04-10 12:24) [0]

В общем никогда с такой проблемой не встречался, а тут вот понадобилось:

type TTestRec = record
StrLength: integer;
Path: string;
StrLength2: integer;
Path2: string;
end;

const filename= "C:\tst.txt";

procedure TForm1.Button1Click(Sender: TObject);
var f: TFileStream;
rec: TTestRec;
tmp: integer;
begin
f:= TFileStream.Create(filename, fmCreate);
try
rec.Path:= "line1";
rec.StrLength:= length(rec.Path);
rec.Path2:= "line2";
rec.StrLength2:= length(rec.Path2);
tmp:=sizeof(rec)+ length(rec.Path)+ length(rec.Path2);
f.WriteBuffer(rec, tmp);
finally f.Free end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var f: TFileStream;
rec: TTestRec;
begin
f:= TFileStream.Create(filename, fmOpenRead);
try
f.ReadBuffer(rec.StrLength, sizeof(rec.StrLength));
f.ReadBuffer(rec.path, rec.StrLength);
f.ReadBuffer(rec.StrLength2, sizeof(rec.StrLength2));
f.ReadBuffer(rec.path2, rec.StrLength2);
finally f.Free end;
end;


Строка выделенная жирным явно читает не те байты которые должна.....Помогите плз.



Anatoly Podgoretsky   (2002-04-10 12:30) [1]

Какой смысл писать указатели в файл?



Виктор Щербаков   (2002-04-10 12:37) [2]

Объявление TStream.ReadBuffer:
procedure ReadBuffer(var Buffer; Count: Longint);
Ссылочные параметры передаются как адреса соответствующих им переменных.
Для строки
f.ReadBuffer(rec.path, rec.StrLength);
будет сгенерирован код с передачей в функцию адреса rec.path.
Но! по этому адресу метод TStream.ReadBuffer и будет располагать прочитанные данные. Что, я думаю, не соответствовало твоему намерению.
Выход:
1. Устанавливай заранее длину строки.
2. Передавай в функцию rec.path[1]

PS: не плохо было бы посмотреть код записи в файл.



dymka   (2002-04-10 12:42) [3]

Есть смысл пересмотреть структуру файла - самое простое:
строки объеденить в одну с использованием какогонить разделителя неиспользуемого в строках (|, &,



Anatoly Podgoretsky   (2002-04-10 12:48) [4]

Так как речь идет об PATH, то лучше
Path : ShortString;
Path2 : ShortString;



Anatoly Podgoretsky   (2002-04-10 12:49) [5]

Виктор Щербаков © (10.04.02 12:37)
f.WriteBuffer(rec, tmp);



Lame1   (2002-04-10 12:51) [6]

Нее, мне надо это в оверлей экзешника писать:( Структура записи намного сложнее, а всем строкам по 100байт отдавать это самоубийство......и почему первая запись читается как надо, а вторая нет?

Замучался я



Виктор Щербаков   (2002-04-10 12:57) [7]


> Замучался я

Не мучайся, приведи код ЗАПИСИ в файл. Если он такой как в Anatoly Podgoretsky © (10.04.02 12:49), то о какой "правильности" чтения может идти речь.



Lame1   (2002-04-10 13:01) [8]


> Виктор Щербаков © (10.04.02 12:57)

Да такой он.....но почему-то ведь первая часть пишется......а как правильно его писать?



Anatoly Podgoretsky   (2002-04-10 13:06) [9]

Сменить типы ка рекомендовано или сменить подход, строки з записи убрать, заменить на длину и сразу за записью писать уже сами строки



Виктор Щербаков   (2002-04-10 13:07) [10]

В структуре TTestRec не содержатся сами строки. Только указатель, длина и счетчик ссылок. И именно это ты и пишешь в файл. Делай выводы.



Lame1   (2002-04-10 13:12) [11]

Дэмн ит, врубил:)

Спасибо всем...



Lame1   (2002-04-10 13:21) [12]

Просто хотел спросить: этот код работает потому-что он правильный или потому-что я неправильный?

type TTestRec = record
StrLength: integer;
Path: string;
StrLength2: integer;
Path2: string;
end;

const filename= "C:\tst.txt";

procedure TForm1.btnWriteClick(Sender: TObject);
var f: TFileStream;
rec: TTestRec;
begin
f:= TFileStream.Create(filename, fmCreate);
try
rec.Path:= "line1";
rec.StrLength:= length(rec.Path);
rec.Path2:= "line2";
rec.StrLength2:= length(rec.Path2);
f.WriteBuffer(rec.StrLength, sizeof(rec.StrLength));
f.WriteBuffer(rec.Path, length(rec.Path));
f.WriteBuffer(rec.StrLength2, sizeof(rec.StrLength2));
f.WriteBuffer(rec.Path2, length(rec.Path2));
finally f.Free end;
end;

procedure TForm1.btnReadClick(Sender: TObject);
var f: TFileStream;
rec: TTestRec;
begin
f:= TFileStream.Create(filename, fmOpenRead);
try
f.ReadBuffer(rec.StrLength, sizeof(rec.StrLength));
f.ReadBuffer(rec.Path, rec.StrLength);
f.ReadBuffer(rec.StrLength2, sizeof(rec.StrLength2));
f.ReadBuffer(rec.Path, rec.StrLength2);
finally f.Free end;
end;




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.027 c
1-69866           kalinka               2002-04-09 09:48  2002.04.22  
Создание и удаление динамических массивов


1-69906           DeMoN-777             2002-04-09 14:09  2002.04.22  
Поиск в ListBox


7-70044           Delphimun             2002-01-27 15:54  2002.04.22  
Существует ли в Способ запустить пргу ещё до загрузки windows(в dos)


1-69773           VJar                  2002-04-10 00:42  2002.04.22  
Небольшой почтовый проект


14-69994          Дмитрий               2002-03-15 12:24  2002.04.22  
Документооборот?