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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2008, 14:49   #11
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

У меня в мыслях не было вас переубеждать, я просто объяснил принцип действия. Выбор за вами.
Что выбрать зависит от ряда факторов, если размер файла не важен, я бы выбрал типизированный, с ним удобно работать. Если же размер файла важен, я бы или писал в текстовый, или типизированный для чисел + текстовый для строк, или в свой формат, это наиболее трудоемкий вариант, но зато его можно "заточить" для решения своей задачи.
Также в zip можно сжимать, если размер совсем критичный параметр.

Цитата:
Вот я например хочу записать много чисел и строк разной длины.
А как мне потом считывать их если я не знаю скока байтов мне надо считать с файла?
Если речь идет о текстовом нужно его "парсить" (от парсинг).
То есть нужно придумать метки (теги), и на их основе делать выводы что это за информация и куда ее считывать.

Самый простой вариант записи/чтения строк без чисел (числа будут в типизированном файле).
С помощью TStringList, методы SaveToFile, LoadFromFile. Нужно будет только определиться какие строки к какой записи относятся, например по три строки на запись:
StringList[0]
StringList[1]
StringList[2] первая запись

StringList[3]
StringList[4]
StringList[5] вторая запись и т.д.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 20.07.2008 в 14:58.
mutabor вне форума Ответить с цитированием
Старый 20.07.2008, 21:36   #12
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

Ну если очень хочется то можно использовать потоки, т.о вписать вначале размер буфера(переменная типа longword), а потом сам буфер... Ну это например. Как я понял тут спршивают что использовать.. тогда почему бы не потоки?!
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Старый 20.07.2008, 23:13   #13
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Думаю вопрос себя иcчерпал

Код:
const
  RecSize = SizeOf(Integer) {Flag1,Flag2,StrLen} * 3;

type
  TRec = packed record
    Flag1: Integer;
    Flag2: Integer;
    StrLen: Integer;
    Str: String; // String в конце записи, ВАЖНО
  end;
  TRecArray = array of TRec;

procedure WriteRec(f: File; RecArray: TRecArray);
var
  i: Integer;
begin
{$I-}
  for i:= 0 to Length(RecArray) - 1 do
  begin
    RecArray[i].StrLen := Length(RecArray[i].Str);
    BlockWrite(f, RecArray[i], RecSize);
    BlockWrite(f, Pointer(RecArray[i].Str)^, RecArray[i].StrLen);
  end;
{$I+}
end;

procedure ReadRec(f: File; var RecArray: TRecArray);
var
  res: Integer;
begin
{$I-}
  SetLength(RecArray, 0);
  while (FilePos(f) < FileSize(f)) do
  begin
    SetLength(RecArray, Length(RecArray) + 1);
    BlockRead(f, RecArray[Length(RecArray) - 1], RecSize, res);
    if (res <> RecSize) then
    begin // error
      SetLength(RecArray, Length(RecArray) - 1);
      Break; 
    end;
    if (RecArray[Length(RecArray) - 1].StrLen > 0) then
    begin
      SetLength(RecArray[Length(RecArray) - 1].Str, RecArray[Length(RecArray) - 1].StrLen);
      BlockRead(f, Pointer(RecArray[Length(RecArray) - 1].Str)^, RecArray[Length(RecArray) - 1].StrLen, res);
      if (res <> RecArray[Length(RecArray) - 1].StrLen) then
      begin // error
        SetLength(RecArray, Length(RecArray) - 1);
        Break;
       end;
    end;
  end;
{$I+}
end;

Последний раз редактировалось BOBAH13; 20.07.2008 в 23:16.
BOBAH13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с файлами в с++ kermit Помощь студентам 13 09.06.2008 02:21
работа с файлами Antonio86 Общие вопросы Delphi 0 20.01.2008 16:27
Работа с файлами Zenit10 Помощь студентам 2 19.01.2008 09:59