Показать сообщение отдельно
  #11  
Старый 25.11.2013, 16:55
kti kti вне форума
Прохожий
 
Регистрация: 21.11.2013
Сообщения: 10
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Position начинается с нуля. Например имеем файл размером 1000 байт, значит Position=0 будет соответствовать самому первому байту файла, а Position=999 будет соответствовать последнему байту файла, но при Position=999 ещё можно прочесть этот самый один последний байт и тогда станет Position=1000 (за концом файла), что означает что файл закончился. Т.е. проверка на конец файла должна быть такая:
Код:
if FS.Position = FS.Size then ShowMessage('Достигнут конец файла');
// или для надёжности можно проверять на "больше или равно":
if FS.Position >= FS.Size then ShowMessage('Достигнут конец файла');

Почему?! У меня данные считываются блоками в цикле:

Код:
     while 1=1 do begin
        // сам шаблон не считываем, а пропускаем
        if FS.Read(template1Length, SizeOf(template1Length)) <= 0 then break; // Сначала считываем размер данных
        FS.Position := FS.Position + template1Length; // Пропускаем ненужный блок (вместо его чтения)

        if FS.Position >= FS.Size-1 then break; // файл кончился
      end;

Если я буду сравнивать FS.Position >= FS.Size, то у меня начнется новый виток цикла (из-за этого 1000 байта), который мне совершенно не нужен.
Например, 1000 байт, 5 блоков по 200 байт. Сделав 5 витков - Position будет равен 999, и проверка FS.Position >= FS.Size не сработает, и начнется 6 виток. Или я что-то не понимаю..
Ответить с цитированием