Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение ;записей из файла [D6, WinXP]


Lame1 ©   (2002-04-10 12:24:00) 

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

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;


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


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

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

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;


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

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

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


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

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


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

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


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


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

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


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


> Замучался я

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


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

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

Замучался я


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

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


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

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


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

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


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

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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо