Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с чтением текста из 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) ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо