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

Вниз

Проблемка с записью строк в фаил   Найти похожие ветки 

 
GTR ©   (2005-10-14 21:12) [0]

Уважаемые знатоки прошу у вас совета :)
Смысл в чем...надо записать массив записей в фаил, запись содержит в себе integer и string (длина неизвестна).
Пытаюсь записать в TFileStream:
SetLength
SetLength(string,Length(string));
и потом
file.Write(Length(string),sizeof(integer)) ; //запоминаю длину строки чтобы
её считать из файла.
file.Write(string,Length(string)) ;
можно было записать
При считывании из файла
file.Read(length_str,sizeof(integer)); //считываю длину строки
file.Read(string,length_str); //должна считаться строка

потом пробовал записать в в нетипизированный фаил:
получил тоже самое...причем..если водной процедуре сначала записать фаил, закрыть его используя CloseFile(); и потом открытть и начсать считывать из него...то все проходит как по маслу, но при записи одной прогой, а считывании другой, строки заменяются неизвесными выражениями :(

Пооги плиз :)


 
begin...end ©   (2005-10-14 21:24) [1]

> GTR ©   (14.10.05 21:12)

> file.Write(string,Length(string))

FileStream.Write(Str[1], Length(Str))

> file.Read(string,length_str)

FileStream.Read(Str[1], length_str)

И нужную длину строки перед чтением в неё установить не забудьте.


 
GTR ©   (2005-10-14 23:09) [2]

я это и делаю (прошу прошения немного перепутал коды) :
var
str:string;
str_len:integer;
f:TFileStream;
begin
SetLength(str,length(str));
f:=TFileStream("data.dat",fm_Create);
i:=sizeof(str);
f.Write(i,sizeof(i));
f.Write(str,i);
f.Free;
-----
Процедура чтения:
var
str:string;
str_len:integer;
f:TFileStream;
begin
f:=TFileStream("data.dat",fm_Open);
f.Read(i,sizeof(i));
SetLength(str,i);
f.Read(str,i);
f.Free;


 
Virgo_Style ©   (2005-10-14 23:58) [3]

GTR ©   (14.10.05 23:09) [2]

в [1] кое-что жирным шрифтом выделено...

GTR ©   (14.10.05 21:12)
причем..если в одной процедуре...


не совсем ясно, в чем отличие 1-го способа от второго. Я надеюсь, запись и чтение происходят не одновременно?


 
Плохиш ©   (2005-10-15 00:45) [4]


> GTR ©   (14.10.05 23:09) [2]

Тонко намекну: SizeOf(str) = 4


 
GTR ©   (2005-10-15 05:42) [5]

FileStream.Write(Str[1], Length(Str))
Ведь в ней  считывается строка единичной длины (проще говоря символ), а если длина строки 22 ?
Чем данная строка отличается от
f.Read(i,sizeof(i));
?

Поясню немного на счет процедур:
на форме имеется button1,Edit1,button2,label1.

procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
i:integer;
f:TFileStream;
begin
f:=TFileStream.Create("data.dat",fmCreate);
s:=Edit1.Text;
Setlength(s,length(s));
i:=length(s);
f.Write(i,sizeof(i));
f.Write(s,i);
f.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
s2:string;
i2:integer;
f2:TFileStream;
begin
f2:=TFileStream.Create("data.dat",fmOpenRead);
f2.Read(i2,4);
SetLength(s2,i2);
f2.Read(s2,i2);
f2.Free;
Label1.Caption:=s2;
end;

Если сначала нажать Button1, то есть создать фаил и записать в него строку, а потом Button2, то строка считывается, но не вся а токо четное кол-во символов (если исходная строка qwe, то считается qw; если исходная qwer, то считывается qwer),
Но при попытке сделать следующее:
Запустить программу, записать фаил кнопкой Button1, выйти из программы, запустить её заного, и нажать кнопку Button2, то получается что Label1 выдает неизвестный текст :(.


 
Anatoly Podgoretsky ©   (2005-10-15 10:38) [6]

Плохиш ©   (15.10.05 00:45) [4]
Намек неудачный и он ему глупо последовал.

GTR ©   (14.10.05 23:09) [2]
SetLength(str,length(str));

Что здесь сказать то хотел? установить длину S равной длине S, масло сделать масляным.

Прочитай внимательно Virgo_Style ©   (14.10.05 23:58) [3], все дело в этом


 
palva ©   (2005-10-15 11:28) [7]

> FileStream.Write(Str[1], Length(Str))
Ведь в ней  считывается строка единичной длины (проще говоря символ), а если длина строки 22 ?

Нет не так. Первый параметр метода Write описан как нетипизированный const, это значит метод принимает данные любого типа в виде указателя на начало данных. Длина данных указывается явно во втором параметре. Когда вы пишете
Write(Str, Length(Str))
то вы передадите адрес четырехбайтового указателя (которым фактически является строка) и запишите в файл этот указатель и тот мусор, который следует за этим указателем в памяти. Ни один символ строки в файл при этом не попадает.


 
Плохиш ©   (2005-10-15 12:45) [8]


> Anatoly Podgoretsky ©   (15.10.05 10:38) [6]
> Плохиш ©   (15.10.05 00:45) [4]
> Намек неудачный и он ему глупо последовал.

Он ему последовал? Где? Он его даже не понял? :-)

> GTR ©   (15.10.05 05:42) [5]
> FileStream.Write(Str[1], Length(Str))
> Ведь в ней  считывается строка единичной длины (проще говоря
> символ), а если длина строки 22 ?
> Чем данная строка отличается от
> f.Read(i,sizeof(i));

Ты хочешь, чтобы тебе здесь начали перепечатывать книги по программированию? Фигушки. Придётся тебе самому заняться теорией.

PS. Скоро ветку отправять в потрепаться, там и поприкалываемся.



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

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

Наверх




Память: 0.49 MB
Время: 0.045 c
14-1129572157
eagle_ua
2005-10-17 22:02
2005.11.06
Как создать объект в Delhpi?


2-1128595845
norwikh
2005-10-06 14:50
2005.11.06
В Win98 проекты ведут себя весьма странно


1-1129130135
DelphiLexx
2005-10-12 19:15
2005.11.06
Экспорт TChart в Word


3-1127894734
axx
2005-09-28 12:05
2005.11.06
FireBird SQL синтаксис


11-1110074904
серый мЫш
2005-03-06 05:08
2005.11.06
TKOLMainMenu