Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2010, 15:13   #1
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
Восклицание TFileStream не сохраняет [delphi]

Здравствуйте.
Вот пришлось взяться за TFileStream. Пытался с ним раньше работать, но как-то не получалось... Не могу сохранить ничего в файл, ну и соответственно прочитать. Я так понимаю, что не верно что-то в SizeOf.
Подскажите что делать?

Функция сохранения
Код:
try
   begin
     Fn:=ExtDel(Fn)+'.bop';
     str:=Crypt('#bop_');
     l:=Sg.RowCount;
     BopStream:=TFileStream.Create(Fn,fmCreate);
     BopStream.WriteBuffer(l,sizeof(l));
     BopStream.WriteBuffer(str,sizeof(str));
     str:='';
     for i:=1 to l do
     begin
       str:=Crypt(Sg.Cells[0,i]);
       BopStream.WriteBuffer(str,sizeof(str));
       str:=Crypt(Sg.Cells[1,i]);
       BopStream.WriteBuffer(str,sizeof(str));
       str:=Crypt(Sg.Cells[2,i]);
       BopStream.WriteBuffer(str,sizeof(str));
       str:=Crypt(Sg.Cells[3,i]);
       BopStream.WriteBuffer(str,sizeof(str));
     end;
     BopStream.Free;
   end;
 except
     Result:=false;
     BopStream.Free;
 end;
Процедура открытия
Код:
procedure TMainForm.Button2Click(Sender: TObject);
var
 i,l:integer;
 str,tmp:string;
begin
     tmp:='';
     BopStream:=TFileStream.Create('C:\Documents and Settings\Arkuz\Рабочий стол\333.bop',fmOpenRead);
     BopStream.ReadBuffer(l,sizeof(integer));
     BopStream.ReadBuffer(str,sizeof(string));
    // str:=Decrypt(str);
     for i:=1 to l do
     begin
       BopStream.ReadBuffer(str,sizeof(string));
       str:=Decrypt(str);
       tmp:=tmp+str+'  ';

       BopStream.ReadBuffer(str,sizeof(string));
       str:=Decrypt(str);
       tmp:=tmp+str+'  ';

       BopStream.ReadBuffer(str,sizeof(string));
       str:=Decrypt(str);
       tmp:=tmp+str+'  ';

       BopStream.ReadBuffer(str,sizeof(string));
       str:=Decrypt(str);
       tmp:=tmp+str+'  ';

       ListBox1.Items.Add(tmp);
       tmp:='';
     end;
     BopStream.Free;
end;
Arkuz вне форума Ответить с цитированием
Старый 26.11.2010, 17:46   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

str := ...
str - какой тип данных? строка небось?
попробуйте сохранять так:
Код:
var W : longint;
....
    str:=Crypt(Sg.Cells[0,i]);
    W := length(str); 
    {записываем сначала длину строки}
    BopStream.WriteBuffer(W, sizeof(W));
    {потом, собственно строку}
    if W>0 then 
       BopStream.WriteBuffer(str[1], W);
читать примерно так:
Код:
    
   BopStream.ReadBuffer(W, sizeof(W));
   if W = 0 then str := '' 
   else begin
     SetLength(str, W);
     BopStream.ReadBuffer(str[1], W);
   end;
p.s. если версия Delphi => 2010 - то возможны проблемы с Unicode строками.... Надо или умножать длину на 2 или использовать AnsiString....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2010, 21:30   #3
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Serge_Bliznykov, объясните код мне пожалуйста:

BopStream.WriteBuffer(W, sizeof(W)); - тут понятно...

if W>0 then BopStream.WriteBuffer(str[1], W); - вот здесь не понятно, особенно про str[1]. Почему один?
Arkuz вне форума Ответить с цитированием
Старый 26.11.2010, 22:01   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

нумерация в строке в Pascal всегда начинается с первого символа. т.о. str[1] - это указатель на первый символ строки.

p.s. так предложенный вариант работает?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2010, 23:22   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Надо или умножать длину на 2
лучше на SizeOf(char)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.11.2010, 11:08   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

отвечаю на вопрос в личку...

вот работающий пример.
StrExample1.rar


Arkuz, Вашего кода не видно,
поэтому трудно сказать, где Вы сделали ошибку.
проверяйте размер, который Вы указываете при записи строки в файл...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.11.2010, 15:42   #7
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

спасибо, очень помогли. Теперь вродебы всё работает...
Arkuz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access violation в TFileStream RoadTrain Общие вопросы Delphi 5 17.10.2010 10:51
Объясните мне TFileStream Манжосов Денис :) Помощь студентам 1 15.11.2008 13:36
проблемы с TFileStream andrey4623 Общие вопросы Delphi 9 01.11.2007 20:44
сохранение изображения с TFileStream andrey4623 Общие вопросы Delphi 10 20.10.2007 20:28
TFilestream UnD)eaD)Snake Win Api 1 27.09.2007 21:22