Форум: "Основная";
Поиск по всему сайту: 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.033 c
3-69711           Zombie                2002-04-01 08:18  2002.04.22  
Containg в BDE


3-69708           Отчаявшийся           2002-03-28 23:49  2002.04.22  
Не удается подключиться к Interbase по сети


1-69930           Veselov               2002-04-08 20:10  2002.04.22  
PDF, или как получить доступ к тексту внутри него ?


6-69951           Димка-1200            2002-02-11 10:03  2002.04.22  
Народ, как с помощью TWebBrowser (или чего другого) заполнить поля в HTML


1-69873           ymin                  2002-04-09 11:21  2002.04.22  
Как проще всего распечатать StringGrid? Кстати она помещается на.