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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2012, 20:50   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию Типизированные файлы. Чтение sz строки.

Доброго времени суток!

Есть некий файл. Я хочу написать к нему редактор.
Вот его описание:
Цитата:
int8/uint8 - Signed or Unsigned Byte (8 bits). C types: char, unsigned char
int16/uint16 - Signed or Unsigned Word (16 bits). C types: short, unsigned short
int32/uint16 - Signed or Unsigned Doubleword (32 bits). C types: int, unsigned int
sz - Zero-terminated C-style string

int16 - VERSION
uint16 - Bytes in first string (if 0, no entries)
sz - Name (read N bytes, where N is previous uint16)
Первые 4 байта читаю нормально:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  fs: TFileStream;
  iVer, iNum: Integer;
begin
  FS := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'stats.dat', fmOpenReadWrite);
  try
    fs.Position := fs.Read(iVer, 2); //Версия
    Memo1.Lines.Add('version is ' + IntToStr(iVer));
    fs.Position := fs.Read(iNum, 2); //Длинна первой строки
    Memo1.Lines.Add('First string bytes = ' + IntToStr(iNum));
   {
    Как считать Zero-terminated C-style string 
   }
  finally
    fs.Free;
  end;
end;
в iNum есть значение 5, когда тектом там всего 4 буквы, и это понятно 5 т.к. там терминальный нуль.

Как считать?

ReadBuffer,Read в array[x..x] Of PChar или в array of Char, array of PChar выпадают в AV.

[Update]

Код:
    fs.Read(iNum, 2);  //uint16 - Bytes in first string
    fs.Seek(4,soFromBeginning);
    sName:=AllocMem(iNum);  //sname:array of PChar;
    try
    fs.ReadBuffer(sName,iNum); //sName становится больше чем iNum
    finally
      FreeMem(sName); //AV, раньше выкидывало в fs.free
    end;

Последний раз редактировалось Человек_Борща; 09.03.2012 в 21:19.
Человек_Борща вне форума Ответить с цитированием
Старый 09.03.2012, 21:12   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В D7 прочитал бы напрямую в String без нуля
Код:
var s: String;
...
  SetLength(s,iNum-1);
  fs.Read(s[1],iNum-1);
  fs.Position:=fs.Position+1;
ADD и iVer, iNum объявил бы как WORD если уж читаем по 2 байта
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.03.2012 в 21:17.
Аватар вне форума Ответить с цитированием
Старый 09.03.2012, 21:26   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Благодарю. Все оказалось проще....
Человек_Борща вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень нужно сделать задачу в Delphi(Типизированные файлы. файлы записи) Vitalik1 Помощь студентам 1 16.12.2011 10:38
Файлы данных.Типизированные файлы. вылка Помощь студентам 6 17.05.2010 15:42
Типизированные файлы Mizantrop Помощь студентам 1 09.04.2010 02:57
Типизированные файлы qwertytol Помощь студентам 2 02.06.2009 08:44
Типизированные файлы. maliyusha Помощь студентам 3 01.03.2009 18:53