Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.22;
Скачать: CL | DM;

Вниз

Чтение записей из файла   Найти похожие ветки 

 
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;



Страницы: 1 вся ветка

Текущий архив: 2002.04.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
1-69880
kosty
2002-04-09 11:47
2002.04.22
Как присвоить значение в ячейке Эксэля?


6-69940
A-leksey
2002-02-05 12:12
2002.04.22
Нужно, чтобы трафик бравзера шел через мое приложение. Прсто я типа сервер - он типа клиент.


1-69923
Vlad_Leon
2002-04-09 08:41
2002.04.22
Как сменить раскладку клавиатуры?


14-70005
dimich
2002-03-16 09:07
2002.04.22
Песни про Counter Strike


3-69681
tovSuhov
2002-03-29 11:19
2002.04.22
Вопрос по DBMS_PIPE