Форум: "Основная";
Текущий архив: 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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c