Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Вниз

Проблема с чтением текста из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.039 c
2-1188571097
sashap
2007-08-31 18:38
2007.09.30
Отправка символа другому окну


2-1188981955
Bast
2007-09-05 12:45
2007.09.30
idsmtp и idpop3


2-1188830690
BFG9k
2007-09-03 18:44
2007.09.30
запрет перетаскивания окна


2-1188920622
General
2007-09-04 19:43
2007.09.30
Копирование имени файла


15-1188494431
Bad_B
2007-08-30 21:20
2007.09.30
Жаворонки и совы(эксперимент)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский