Помощь новичкам


#2219

Учитывая тот факт, что слово “учитьСЯ” подразумевает пояснение самому себе, то технически нет никаких других учителей :upside_down_face:

А если string[4] устарело, то как методически верно проверить сигнатуру файла PDF - прочитать первые четыре байта как текст “%PDF” ?


#2220

Устарело с точки зрения использования коротких строк где ни поподя. Есть ситуации, в которых без коротких строк не обойтись. Конкретно по Вашему вопросу: на мой взгляд тут вполне нормально использовать короткую строку и читать в нее “по старинке” оператором Read.

А еще можно, например, вот так:

begin
  var f: file;
  Reset(f, 'Tri.pdf');
  var s: string := '';
  loop 4 do
    s += f.ReadChar;
  f.Close;
  if s = '%PDF' then
    Println('Распознана сигнатура PDF-файла')
end.

#2221

Нет, это плохо. .ReadChar работает, используя очень сложный алгоритм декодирования. Лучше прочитать 4 байта в сырую и проверить на правильные значения.

А чтоб не добавлять волшебные числа в код - можно использовать word('P') и т.п. Преобразование char в word - это на самом деле не преобразование, а копирование памяти. И JIT компилятор наверняка оптимизирует такое приведение литерала.

А это вообще жуть, сложение строк это медленная операция, и они тут вообще не нужны.
Если уже делать типо как универсально:

(в отдельной функции)

foreach var ch in '%PDF' do
  if f.ReadByte <> word(ch) then
    exit;
Result := true;

Но если заменить это на 4 проверки - в данном случае код не становиться сложнее:

if f.ReadByte <> word('%') then exit;
if f.ReadByte <> word('P') then exit;
if f.ReadByte <> word('D') then exit;
if f.ReadByte <> word('F') then exit;
Result := true;

#2223

Вы, как всегда, в своем амплуа. Пофиг размер кода, пофиг ясность алгоритма, зато можно выгадать пару миллисекунд. Даже разбирать Ваш код не стану - фактически это почти ассемблер.


#2224

В данной задаче, с учётом краткости кода, не думаю, что скорость критична.


#2225

На фоне времени открытия файла операционной системой говорить об эффективности кода чтения четырех байт смысла не вижу.


#2226

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