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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2012, 21:11   #41
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Сначала проверьте, а потом утверждайте:
Код:
procedure Save(const AText:AnsiString);
var
  Lfs:TFileStream;
  Lsz:Integer;
begin
  try
    Lfs:=TFileStream.Create('D:\data.bin',fmCreate);//создали файл
    Lsz:=Length(AText);//взяли длину строки
    Lfs.WriteBuffer(Lsz,4);//записали длину строки
    Lfs.WriteBuffer(Pointer(AText)^,Lsz);//записали саму строку
  finally
    Lfs.Free;//обязательно освободили файл
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  LsTempList:TStringList;
  i:Integer;
begin
  LsTempList:=TStringList.Create;
  LsTempList.LineBreak:=#0;
  for i:=0 to 99 do
    LsTempList.Add('Z');
  Save(LsTempList.Text);
  FreeAndNil(LsTempList);
end;
Размер файла получается 204 байта: 4 байта длина строки свойства Text, 100 символов "Z" и разделитель символ #0. Никто ничего не обрезает. Придумали проблему
А функция загрузки из файла как выглядеть будет? напиши плиз если не сложно..
JekaDefer вне форума Ответить с цитированием
Старый 15.05.2012, 21:26   #42
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Код:
procedure Load(out AText:AnsiString);
var
  Lfs:TFileStream;
  Lsz:Integer;
begin
  try
    Lfs:=TFileStream.Create('D:\data.bin',fmOpenRead);//открыли файл
    Lfs.ReadBuffer(Lsz,4);//сосчитали длину строки
    SetLength(AText,Lsz);//задали размерность строке
    Lfs.ReadBuffer(Pointer(AText)^,Lsz);//сосчитали саму строку
  finally
    Lfs.Free;//обязательно освободили файл
  end;
end;
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 15.05.2012, 21:52   #43
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

Блин какой же все таки сложный этот TStringList. Помогите в последний раз правильно отобразить то что мы загрузили в итоге... Жесть!
Вложения
Тип файла: rar 1.rar (8.4 Кб, 6 просмотров)
JekaDefer вне форума Ответить с цитированием
Старый 15.05.2012, 22:25   #44
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Если так актуально отобразить именно, то используйте только юникод:
1.rar
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 15.05.2012, 22:47   #45
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

в смысле так я просто это отобразить не могу а так по идее она вся загружена? и потом ее расшифруется ВСЯ и норм отобразится?
JekaDefer вне форума Ответить с цитированием
Старый 15.05.2012, 23:06   #46
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Я тебе исходник исправленный прикрепил. Лень посмотреть?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 16.05.2012, 15:37   #47
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

Я посмотрел и задал вопрос. В обычной кодировке (не в Unicode) она все равно загружает всё, но просто из-за #0 нельзя это отобразить?
JekaDefer вне форума Ответить с цитированием
Старый 16.05.2012, 15:50   #48
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

нет, там различия в конвертации из ANSI в UNICODE и обратно. Юникод введен с делфи 2009. Просто используйте везде тип String вместо AnsiString.
Пример смотрели? Работает?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 16.05.2012, 15:57   #49
JekaDefer
Форумчанин
 
Регистрация: 07.04.2009
Сообщений: 112
По умолчанию

пример смотрел! Если использовать String то сохранение происходит нормально (сохраняет всё и знак #0) а вот загрузить обратно из файла не получается (отображается всё, что идет до #0), у меня Delphi 7, но я думаю, что должен быть способ и без Unicode, потому что тогда теряется смысл команды SaveToFile (типа сохранять можно не всё что напихано в TStringList).
JekaDefer вне форума Ответить с цитированием
Старый 17.05.2012, 10:06   #50
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

JekaDefer, ты где-то мудришь сильно. Если тебе надо просто инфу хранить, то какие стринглисты, юзай поток байт, пиши туда всё что хочешь, читай, по своему алгоритму.

Тип. файлы и стринглисты для контролируемых данных, для смешанных плохо приспособлены.

вот сурсъ, могу дать куски исходника и побольше, из своей проги тестирования, но думаю должно хватить.

Примечания: майнсис - класс рулящий всем, в т.ч. коллекцией вопросов(загруженной из теста) и коллекцией файлов тестов

decode - encode функции шифрования/дешифрования потока байт, 1 к 1, но можно и со сжатием.

Функции читания и писания строк - см. в постах др форумчан, суть - пишется размер данных, потом любые данные. ну и для чтения в строку, её сперва надо создать сетленсом (ибо строки - автоуправляемые динамические типы)

Код:
// хедер файла теста
Rtest = record
  fname, name, descr : string;
  fsize : integer;
  quescnt, testtime, hdrsize : word;
  end;
// класс вопроса
Tques = class (tcollectionitem)
  private
    function getanscnt: Byte;
  public
  ques: string;
  kind : NQkind;
  answers: Tanswers;
  imgsize : Integer;
  jpeg : tjpegimage;
  destructor destroy; override;
  property ansqnt : Byte read getanscnt;
  end;
// загрузчик
function storageload(mainsys : tmainsys; storid : byte) : boolean;
var ms,msj : tmemorystream;
i,j,w : word ;
b : byte;
sz : integer;
begin
result := False;
with mainsys
  do if (fileexists(storar[storid].fname))
    then  try
      ms := tmemorystream.create;
      ms.LoadFromFile(storar[storid].fname);
      decode(ms);
      ms.seek(storar[storid].hdrsize, sofrombeginning);
      questions.Clear;
      for i := 0 to storar[storid].quescnt-1
        do begin
        addques;
        ms.read(w, sizeof(w));
        setlength(questions[i].ques, w);
        ms.read(questions[i].ques[1], w);
        ms.read(b, sizeof(b));
        questions[i].kind := Nqkind(b) ;
        ms.read(b, sizeof(b));
        //questions[i].ansqnt := b;
        j := 0;
        while j < b
          do begin
          questions[i].answers.Add;
          ms.read(w, sizeof(w));
          setlength(questions[i].answers[j].ans, w);
          ms.read(questions[i].answers[j].ans[1], w);
          inc(j);
          end;
        ms.read(sz, sizeof(sz));
        questions[i].imgsize := sz;
        if sz > 0
          then begin
          questions[i].jpeg := tjpegimage.create;
          msj := TMemoryStream.Create;
          while msj.Position <> sz +1
            do begin
              ms.Read(b,SizeOf(b));
              msj.write(b,SizeOf(b));
            end;
          msj.Seek(0, sofrombeginning);  
          questions[i].jpeg.LoadFromStream(msj);
          freeandnil(msj);
          end;
        end;
    Result := True;
    except
    end;
  freeandnil(ms);
end;

function storagesave(mainsys : tmainsys; fname : string) : boolean;
var fs : tfilestream;
ms, msj : TMemoryStream;
b : byte;
i,w : word;
 sz,j : Integer;
begin
try
  ms := TMemoryStream.Create;
  fs := tfilestream.Create(fname, fmCreate);
  for i := 1 to Length(mainsys.storsign)
    do ms.write(mainsys.storsign[i], 1);
  w := length(mainsys.curtest.name);
  ms.Write(w, sizeof(w));
  ms.Write(mainsys.curtest.name[1], w);
  w := length(mainsys.curtest.descr);
  ms.Write(w, sizeof(w));
  ms.Write(mainsys.curtest.descr[1], w);
  w := mainsys.curtest.quescnt;
  ms.Write(w, sizeof(w));
  w := mainsys.curtest.testtime;
  ms.Write(w, sizeof(w));

  for i := 0 to mainsys.questions.Count -1
    do begin

    w := length(mainsys.questions[i].ques);
    ms.Write(w, sizeof(w));
    ms.Write(mainsys.questions[i].ques[1], w);
    b := ord(mainsys.questions[i].kind);
    ms.Write(b, sizeof(b));
    b := mainsys.questions[i].ansqnt;
    ms.Write(b, sizeof(b));
    j := 0;
    while j < b
      do begin
      w := length(mainsys.questions[i].answers[j].ans);
      ms.Write(w, sizeof(w));
      ms.Write(mainsys.questions[i].answers[j].ans[1], w);
      inc(j);
      end;
    if mainsys.questions[i].imgsize <> 0
      then begin
      msj := TMemoryStream.Create;
      mainsys.questions[i].jpeg.SaveToStream(msj);
      sz := msj.size;
      ms.write(sz, SizeOf(sz));
      msj.Seek(0, soFromBeginning);
      j:= 0;
      while  j <= msj.Size
        do begin
        msj.Read(b, SizeOf(b));
        ms.Write(b, SizeOf(b));
        Inc(j);
        end;
      FreeAndNil(msj);  
      end
      else ms.Write(mainsys.questions[i].imgsize,sizeof(mainsys.questions[i].imgsize));

    end;

  mainsys.Encode(ms);

  ms.Position := 0;
  while ms.Position <> ms.Size
    do begin
    ms.Read(b,SizeOf(b));
    fs.write(b,SizeOf(b));
    end;
  freeandnil(ms);
  freeandnil(fs);
  result := true;
except
  freeandnil(ms);
  freeandnil(fs);
  result := false;
  deletefile(fname);
  end;
end;
ps за код не бейте ) я уже так не пишу, этому коду больше года уж

Последний раз редактировалось phomm; 17.05.2012 в 10:11.
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Tstringlist - максимальная длинна строки и макс.кол-во строк? paravoz1k Компоненты Delphi 4 03.02.2020 13:52
Удалить пустые строки из TStringList apromix Общие вопросы Delphi 5 14.09.2016 12:14
Куда деваются русские буквы? Islam_2011 Общие вопросы C/C++ 2 18.09.2011 10:20
Добавление в TMemo, последней строки из TStringList OPF_Nik Помощь студентам 3 31.01.2010 17:35
Подскажите, куда деваются переаменные? Visual C++ Sh2009 Помощь студентам 4 07.05.2009 00:34