Текущий архив: 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