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

Вниз

Проблема с чтением текста из TFileStream   Найти похожие ветки 

 
THandle ©   (2007-09-02 11:45) [0]

Делаю так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 ничего не появляется?

пробовал немного по другому - та же фигня.

ЗЫ Это просто пример


 
Riply ©   (2007-09-02 11:49) [1]

А чему равен sizeof(s) ?


 
THandle ©   (2007-09-02 11:55) [2]

SizeOf(s) := 4;


 
THandle ©   (2007-09-02 11:58) [3]

С записью какраз всё вроде нормально. А вот читать не хочет.
ЗЫ До этого с чем либо подобным не работал


 
Юрий Зотов ©   (2007-09-02 12:05) [4]

> THandle ©   (02.09.07 11:55) [2]

> SizeOf(s) := 4;

В том-то и дело, что всегда 4 и не зависит от длины текста. А ведь должно зависеть, не так ли?

Вывод - SizeOf здесь не годится. А годится Length. А почему - посмотрите в справке, в разделе "Long strings".


 
THandle ©   (2007-09-02 12:07) [5]

Да уж дагадался. Тока вс| равно ни черта ни читает.


 
Riply ©   (2007-09-02 12:19) [6]

>[3] THandle ©   (02.09.07 11:58)
>С записью какраз всё вроде нормально.
Сомневаюсь.
Я спросила про sizeof(s), чтобы показать, что строка это указатель.
Записывать надо то, на что она указывает, а перед чтением позаботиться о том,
чтобы размера буфера хватило для этой операции.


 
Reindeer Moss Eater ©   (2007-09-02 12:19) [7]

Cначала строку подготовь, чтобы место для чтения было.
Затем укажи правильно первый параметр для Read


 
Anatoly Podgoretsky ©   (2007-09-02 12:23) [8]

> THandle  (02.09.2007 11:58:03)  [3]

Во первых с записью не нормально, а во вторых чтения не видать.


 
Anatoly Podgoretsky ©   (2007-09-02 12:24) [9]

> THandle  (02.09.2007 12:07:05)  [5]

Так в данном коде слишком много ошибок, ну зачем писать указатель в файл, где обработка ошибок (защищенный блок), не говоря уже о SizeOf


 
sniknik ©   (2007-09-02 12:25) [10]

> Тока вс| равно ни черта ни читает.
нечего читать, бред пишется, если процедура f.Read принимает на вход не строку а массив или ссылку... (что вероятнее всего. ну с чего там быть строке? если и бинарные данные тоже в файлы записывают...)
попробуй
f.Read(s[1], length(s)); или f.Read(PChar(s), length(s)); ...
если измениться "что-то в него записывается" на "записывается тот текст что в Edit1.Text" то все ок, с записью, останется исправить чтение.


 
Anatoly Podgoretsky ©   (2007-09-02 12:26) [11]

Чтение нашел, не было видно в окне.


 
sniknik ©   (2007-09-02 12:26) [12]

сори в [10]  вместо Read  везде подразумевалось Write...


 
Riply ©   (2007-09-02 12:28) [13]

Запись:
f.Write(s[1], Length(s));
Чтение:
SetLength(s, f.Size);
f.Read(s[1], f.Size);


 
THandle ©   (2007-09-02 12:32) [14]

Спасибо огромное. Буду теперь знать.


 
Anatoly Podgoretsky ©   (2007-09-02 12:33) [15]

И зачем здесь вообще используется TFileStream, а не текстовые файлы, где все автоматизировано и нет места для подобных ошибок.


 
THandle ©   (2007-09-02 12:35) [16]

В [0] было же написано что это пример. Используется естественно не здесь.


 
JaK[Light] ©   (2007-09-02 17:30) [17]


> 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);


 
Riply ©   (2007-09-02 20:56) [18]

> [17] JaK[Light] ©   (02.09.07 17:30)
>Имхо, не лучший вариант с точки зрения производительности,
>так как неявно будет вызываться UniqueString.
Может, прежде чем думать о "производительности", стоит научиться хотя бы писать и читать ?
Понимать что происходит и что такое указатель ?
Мне кажется, что пока у автора этого(понимания) нет,
Ваш пост не может оказаться ему полезен, а скорее наоборот :)


 
JaK[Light] ©   (2007-09-02 21:23) [19]


> Мне кажется, что пока у автора этого(понимания) нет, Ваш
> пост не может оказаться ему полезен, а скорее наоборот :)

Почему же? Пусть разбирается :)



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

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

Наверх




Память: 0.51 MB
Время: 0.031 c
2-1188674320
Bast
2007-09-01 23:18
2007.09.30
Перенаправление пакетов


1-1184918084
Makhanev Alexander
2007-07-20 11:54
2007.09.30
Restart сервиса...


2-1188901427
Adventure
2007-09-04 14:23
2007.09.30
Опять про кодовые страницы в Paradox через DBE


2-1188816975
Layner
2007-09-03 14:56
2007.09.30
Определить уникальный номер Windows Registered to (2000-XP-Vista)


2-1188704544
aibolit
2007-09-02 07:42
2007.09.30
как запустить bat файл