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

Вниз

Мистика при чтении данных из потока   Найти похожие ветки 

 
romeo ©   (2003-09-24 18:25) [0]

Есть такая процедура:

procedure TForm1.FormCreate(Sender: TObject);
var
MS1, MS2: TMemoryStream;
S: String;
I: Integer;
begin
S := "Объект 1";
I := SizeOf(S);
MS1 := TMemoryStream.Create;
MS1.Write(S, I);
MS1.SaveToFile("Probe.ext");
MS1.Free;
MS2 := TMemoryStream.Create;
MS2.LoadFromFile("Probe.ext");
MS2.Read(S, I);
MS2.Free;
Caption := S;
end;


Пи запуске приложения заголовок формы - "Объект 1". Вроде все нормально... НО!
Если закрыть приложение и затем просто попробовать прочитать данные из файла:
procedure TForm1.FormCreate(Sender: TObject);
var
MS1, MS2: TMemoryStream;
S: String;
I: Integer;
begin
S := "Объект 1";
I := SizeOf(S);
//MS1 := TMemoryStream.Create;
//MS1.Write(S, I);
//MS1.SaveToFile("Probe.ext");
//MS1.Free;
MS2 := TMemoryStream.Create;
MS2.LoadFromFile("Probe.ext");
MS2.Read(S, I);
MS2.Free;
Caption := S;
end;


то в заголовке формы - "1(@"
Что за полтергейст?


 
Юрий Федоров ©   (2003-09-24 18:29) [1]

I := SizeOf(S);
Если не включена опция {$H-}, то
s - указатель, SizeOf(S) = 4.
В любом случае
MS2.Read(S [1], I);


 
Юрий Федоров ©   (2003-09-24 18:30) [2]

Да и Write тоже...


 
Переяслов Григорий ©   (2003-09-24 18:31) [3]

S := "Объект 1";
I := Length(S);
MS1 := TMemoryStream.Create;
MS1.Write(I, SizeOf(I));
MS1.Write(S, I);
MS1.SaveToFile("Probe.ext");
MS1.Free;

S - ссылка на строку, а не сама строка. Sizeof(S) = 4


 
Skier ©   (2003-09-24 18:31) [4]

begin
S := "Объект 1";
I := Length(S);
MS1 := TMemoryStream.Create;
MS1.Write(S [1], I);
MS1.SaveToFile("Probe.ext");
MS1.Free;
MS2 := TMemoryStream.Create;
MS2.LoadFromFile("Probe.ext");
MS2.Read(S, I);
MS2.Free;
Caption := S;
end;

//...................

begin
S := "Объект 1";
//MS1 := TMemoryStream.Create;
//MS1.Write(S, I);
//MS1.SaveToFile("Probe.ext");
//MS1.Free;
MS2 := TMemoryStream.Create;
MS2.LoadFromFile("Probe.ext");
MS2.Read(I, SizeOf(I));
SetLength(S, I);
MS2.Read(S [1], I);
MS2.Free;
Caption := S;


 
Skier ©   (2003-09-24 18:33) [5]

MS1.Write(I, SizeOf(I)); //+
MS1.Write(S[1], I);


 
romeo ©   (2003-09-24 18:50) [6]

Спасибочки, очень помогли! Все работает, но я не понимаю как...
Почему при Write(S[1], I) и Read(S[1], I) записывается и считывается вся строка, а не только первый символ? Или S[1] - это из другой оперы?


 
romeo ©   (2003-09-24 18:52) [7]

И почему все работало,когда чтение и запись происходили за один прием, а не в разных запусках приложения?


 
Skier ©   (2003-09-24 18:52) [8]


> И почему все работало,когда чтение и запись происходили
> за один прием, а не в разных запусках приложения?

Везло...


 
Юрий Федоров ©   (2003-09-24 18:53) [9]

потому что строка лежит в памяти непрерывно. Считывается начиная с S[1] I байт.


 
Переяслов Григорий ©   (2003-09-24 18:56) [10]

Вгладись в код "за один прием":

S := "Объект 1";
I := SizeOf(S);
MS1 := TMemoryStream.Create;
MS1.Write(S, I);
MS1.SaveToFile("Probe.ext");
MS1.Free;
MS2 := TMemoryStream.Create;
MS2.LoadFromFile("Probe.ext");
MS2.Read(S, I);
MS2.Free;
Caption := S;


 
Юрий Федоров ©   (2003-09-24 18:59) [11]

Просто записал в поток указатель (4 байта), тут же его считал.
Благо адрес S и так такой - повезло, память не испорчена.
Кстати, сначала можно было посмотреть содержимое файла "Probe.ext", а потом уже спрашивать :-)))


 
Skier ©   (2003-09-24 18:59) [12]

>Переяслов Григорий © (24.09.03 18:56)
И то правла ! :)


 
romeo ©   (2003-09-24 19:09) [13]


> Переяслов Григорий © (24.09.03 18:56)

Да, но ведь:

S := "Объект 1";
I := SizeOf(S);
//MS1 := TMemoryStream.Create;
//MS1.Write(S, I);
//MS1.SaveToFile("Probe.ext");
//MS1.Free;
MS2 := TMemoryStream.Create;
MS2.LoadFromFile("Probe.ext");
MS2.Read(S, I);
MS2.Free;
Caption := S;



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
6-18519
FireMan_Alexey
2003-08-06 11:35
2003.10.06
Почему не происходит событие FD_CONNECT?


1-18476
Pohil
2003-09-24 11:43
2003.10.06
Как мне отобразить данные, полученные от ReadBinaryData(Registry)


14-18630
Феликс
2003-09-17 15:15
2003.10.06
Как эта пестня называется?


3-18279
Denizzz
2003-09-17 12:04
2003.10.06
Авторасчет


3-18271
Фагот
2003-09-15 10:26
2003.10.06
Индексы