Текущий архив: 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.48 MB
Время: 0.032 c