Главная страница
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.023 c
6-18514
3APA3A
2003-08-07 22:11
2003.10.06
Свободный порт


6-18505
Lahtak
2003-08-11 12:22
2003.10.06
загрузка с сервера на сервер


3-18264
Dimedrol
2003-09-12 15:59
2003.10.06
глюк в FastReport на preview report ?


6-18497
Vulko
2003-08-09 22:35
2003.10.06
TWebBrowser


14-18632
Nick-From
2003-09-17 11:52
2003.10.06
Нужно ли учить С ?