Определение POSIX текстового файла, похоже, допускает файл, состоящий из одной неполной строки, как текстовый файл – это намеренно?

Вопрос или проблема

POSIX определяет текстовый файл как “файл, который содержит символы, организованные в ноль или более строк”. Тем не менее, согласно определению строки в POSIX, существуют два возможных “типа” текстовых файлов с нулевыми строками:

  • пустой файл
  • непустой файл, состоящий исключительно из одной неполной строки (строки с как минимум одним символом и без \n).

Действительно ли второй случай выше считается текстовым файлом? Интуитивно это не так, поскольку он кажется ничем иным, как пограничным случаем. Тем не менее, такой файл, безусловно, не имеет строк (как их определяет POSIX), потому что он не содержит символ конца строки, так что, похоже, он соответствует текущему определению POSIX текстового файла. Единственный вопрос, подлежащий интерпретации здесь, может заключаться в том, можно ли считать такие файлы “организованными в строки”, но лично я не вижу причин против этого – ничто в определении POSIX не заставляет меня рассматривать их иначе, чем пустые файлы, которые, несмотря на то, что они пустые (и, следовательно, тривиально имеют ноль строк), считаются “организованными в строки”. Возможно, я здесь придираюсь, но я считаю, что определение, как оно есть сейчас, требует небольшого уточнения, чтобы исключить этот случай (если я не прав и такие файлы действительно должны соответствовать определению POSIX текстового файла).

В этой теме:

Какие условия должны быть выполнены, чтобы файл был текстовым файлом, как это определено POSIX?

автор вопроса имел подобные сомнения. В одном из ответов на его вопросы кто-то утверждал, что “текстовый файл не должен иметь неполных строк”. Хотя это дополнительное утверждение действительно исключило бы спорный случай, такое ограничение явно не прописано в определении текстового файла POSIX.

Полное определение текстового файла:

Файл, который содержит символы, организованные в ноль или более строк. Строки не содержат символов NUL, и ни одна из них не может превышать {LINE_MAX} байт в длину, включая <символ конца строки>. Хотя POSIX.1-2017 не проводит различия между текстовыми файлами и двоичными файлами (см. стандарт ISO C), многие утилиты производят предсказуемый или значимый вывод только при работе с текстовыми файлами. Стандартные утилиты, которые имеют такие ограничения, всегда указывают “текстовые файлы” в разделах STDIN или INPUT FILES.

Это, безусловно, особенно запутанное выбор слов в спецификации. То, как я это понимаю, после обсуждения в вопрос-ответ, на который вы сослались, заключается в том, что часть спецификации, которую вы цитируете, должна читаться как “файл, который содержит символы, организованные в ноль или более строк”. То есть файл является текстовым файлом только в том случае, если его содержимое организовано в строки.

Далее POSIX определяет “строки” как:

Последовательность из нуля или более неконечных <символов конца строки> плюс завершающий <символ конца строки>.

И пустые строки как:

Строка, состоящая только из <символа конца строки>; см. также Пустая строка.

Таким образом, мы знаем, что:

  1. Текстовый файл должен иметь свои данные, организованные в строки.
  2. Текстовому файлу разрешено иметь 0 строк.
  3. Строка должна заканчиваться на \n.

Сочетавая эти три пункта, это означает, что:

  • Пустой файл является текстовым файлом, поскольку у него данные организованы в ноль строк.
  • Непустой файл, последний символ которого не является символом конца строки, не является текстовым файлом. Это связано с тем, что его данные не организованы в строки.

Мне показался полезным способ, которым Ильмари объяснил это мне в комментарии, поэтому я включаю это здесь:

[…] текстовый файл POSIX – это любой файл, содержимое которого соответствует регулярному выражению (.{0,M}\n)* (неявно закреплено и с обоих концов), где \n соответствует символу конца строки, а . соответствует любому символу, который не является символом конца строки, и M является заполнителем для числового значения LINE_MAX-1. В частности, это подразумевает, что пустой файл является допустимым текстовым файлом, состоящим из нуля строк, но что любой непустой текстовый файл должен заканчиваться символом конца строки (иначе он содержал бы неполную строку, а неполная строка не является строкой).

Ответ или решение

В соответствии с определением POSIX текстового файла, текстовый файл — это «файл, который содержит символы, организованные в ноль или более строк». Важно отметить, что строки в данном контексте не могут содержать символы NUL и не могут превышать максимальную длину {LINE_MAX} байт, включая символ .

Давайте проанализируем детали и правила, которые определяют текстовые файлы согласно стандарту POSIX:

  1. Организация данных в строки: Утверждение о том, что файл может быть текстовым, основывается на том, что его данные должны быть организованы в строки. В соответствии с определением, строка — это последовательность из нуля или более символов, не являющихся , и завершающаяся символом .

  2. Текстовые файлы с нулем строк: Согласно стандарту, текстовый файл может содержать ноль строк, что означает, что пустой файл (т.е. файл без символов) действительно является текстовым файлом. Этот файл не содержит строк, что соответствует определению, и является допустимым согласно POSIX.

  3. Неполные строки: Вопрос о том, может ли файл, содержащий хотя бы один символ, но не завершающийся символом , считаться текстовым, считается дискуссионным. Согласно определению строки в POSIX, такая последовательность не может быть признана строкой, поскольку не имеет завершающего символа .

Таким образом, если подвести итоги:

  • Пустой файл: Да, он считается текстовым файлом, так как он содержит ноль строк.
  • Файл с одним символом без : Нет, этот файл не может считаться текстовым файлом, поскольку его данные не организованы в строки. Он не содержит ни одной завершенной строки, и по определению POSIX, он не соответствует критериям текстового файла.

Следовательно, можно сделать вывод, что POSIX действительно подразумевает, что текстовые файлы должны быть организованы в строки. Поэтому файлы с неполными строками (т.е. заканчивающиеся без символа перехода на новую строку) не следует считать текстовыми файлами. Для ясности можно сказать, что необходимо уточнить, что текстовый файл должен содержать не только символы, но и соответствовать структурным требованиям, изложенным в определении POSIX.

Данный вопрос открывает двери для дальнейшего обсуждения специфики стандартов и необходимого уровня строгости в интерпретации. Однако на основании изложенных выше аргументов, можно утверждать, что текущая трактовка POSIX вполне логична и соотносится с ожидаемыми принципами работы с текстовыми файлами.

Оцените материал
Добавить комментарий

Капча загружается...