Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
6-69939
Sligger
2002-02-08 20:44
2002.04.22
Почтовая программа


1-69865
roman001
2002-04-07 08:09
2002.04.22
MDI


14-70010
Nikolay
2002-03-15 12:11
2002.04.22
Где можно почитать про итерацию?


1-69888
panoff
2002-04-09 11:53
2002.04.22
Юзер создаёт кол-во строк в MENUItem


1-69868
VAleksey
2002-04-09 08:54
2002.04.22
Копирование каталогов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский