![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с чтением текста из TFileStream
THandle © (2007-09-02 11:45:00)Делаю так6
procedure SaveBtnClick(Sender : TObject);
var
s : string;
f : TFileStream;
begin
if SaveDialog1.Execute then
begin
f := TFileStream.Create(SaveDialog1.FileName, fmCreate);
s := Edit1.text;
f.Write(s, sizeof(s));
f.Free;
end;
end;
Файл создаётся и что-то в него записывается.
Вот так читаю:
procedure OpenBtnClick(Sender : TObject);
var
s : string;
f : TFileStream;
begin
if OpenDialog1.Execute then
begin
f := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
f.Read(s, f.Size);
Edit1.Text := s;
f.Free;
end;
end;
Почему в Edit1 ничего не появляется?
пробовал немного по другому - та же фигня.
ЗЫ Это просто пример
JaK[Light] (2007-09-02 21:23:00) [1]
> Мне кажется, что пока у автора этого(понимания) нет, Ваш
> пост не может оказаться ему полезен, а скорее наоборот :)
Почему же? Пусть разбирается :)
Riply (2007-09-02 20:56:00) [2]> [17] JaK[Light] © (02.09.07 17:30)
>Имхо, не лучший вариант с точки зрения производительности,
>так как неявно будет вызываться UniqueString.
Может, прежде чем думать о "производительности", стоит научиться хотя бы писать и читать ?
Понимать что происходит и что такое указатель ?
Мне кажется, что пока у автора этого(понимания) нет,
Ваш пост не может оказаться ему полезен, а скорее наоборот :)
JaK[Light] (2007-09-02 17:30:00) [3]
> f.Write(s[1], Length(s));
Имхо, не лучший вариант с точки зрения производительности, так как неявно будет вызываться UniqueString.
Лучше так:
Len := Length(S);
f.Write(Len, SizeOf(Len));
if Len > 0 then
f.Write(Pointer(S)^, Len);
...
f.Read(Len, SizeOf(Integer));
SetLength(S, Len);
if Len > 0 then
f.Read(Pointer(S)^, Len);
THandle (2007-09-02 12:35:00) [4]В [0] было же написано что это пример. Используется естественно не здесь.
Anatoly Podgoretsky (2007-09-02 12:33:00) [5]И зачем здесь вообще используется TFileStream, а не текстовые файлы, где все автоматизировано и нет места для подобных ошибок.
THandle (2007-09-02 12:32:00) [6]Спасибо огромное. Буду теперь знать.
Riply (2007-09-02 12:28:00) [7]Запись:
f.Write(s[1], Length(s));
Чтение:
SetLength(s, f.Size);
f.Read(s[1], f.Size);
sniknik (2007-09-02 12:26:00) [8]сори в [10] вместо Read везде подразумевалось Write...
Anatoly Podgoretsky (2007-09-02 12:26:00) [9]Чтение нашел, не было видно в окне.
sniknik (2007-09-02 12:25:00) [10]> Тока вс| равно ни черта ни читает.
нечего читать, бред пишется, если процедура f.Read принимает на вход не строку а массив или ссылку... (что вероятнее всего. ну с чего там быть строке? если и бинарные данные тоже в файлы записывают...)
попробуй
f.Read(s[1], length(s)); или f.Read(PChar(s), length(s)); ...
если измениться "что-то в него записывается" на "записывается тот текст что в Edit1.Text" то все ок, с записью, останется исправить чтение.
Anatoly Podgoretsky (2007-09-02 12:24:00) [11]> THandle (02.09.2007 12:07:05) [5]
Так в данном коде слишком много ошибок, ну зачем писать указатель в файл, где обработка ошибок (защищенный блок), не говоря уже о SizeOf
Anatoly Podgoretsky (2007-09-02 12:23:00) [12]> THandle (02.09.2007 11:58:03) [3]
Во первых с записью не нормально, а во вторых чтения не видать.
Reindeer Moss Eater (2007-09-02 12:19:00) [13]Cначала строку подготовь, чтобы место для чтения было.
Затем укажи правильно первый параметр для Read
Riply (2007-09-02 12:19:00) [14]>[3] THandle © (02.09.07 11:58)
>С записью какраз всё вроде нормально.
Сомневаюсь.
Я спросила про sizeof(s), чтобы показать, что строка это указатель.
Записывать надо то, на что она указывает, а перед чтением позаботиться о том,
чтобы размера буфера хватило для этой операции.
THandle (2007-09-02 12:07:00) [15]Да уж дагадался. Тока вс| равно ни черта ни читает.
Юрий Зотов (2007-09-02 12:05:00) [16]> THandle © (02.09.07 11:55) [2]
> SizeOf(s) := 4;
В том-то и дело, что всегда 4 и не зависит от длины текста. А ведь должно зависеть, не так ли?
Вывод - SizeOf здесь не годится. А годится Length. А почему - посмотрите в справке, в разделе "Long strings".
THandle (2007-09-02 11:58:00) [17]С записью какраз всё вроде нормально. А вот читать не хочет.
ЗЫ До этого с чем либо подобным не работал
THandle (2007-09-02 11:55:00) [18]SizeOf(s) := 4;
Riply (2007-09-02 11:49:00) [19]А чему равен sizeof(s) ?