POSIX определяет текстовый файл как:
Файл, содержащий символы, организованные в ноль или более строк. Строки не содержат символов NUL, и ни одна из них не может превышать длину {LINE_MAX} байтов, включая символ <newline>. Хотя POSIX.1-2017 не делает различий между текстовыми файлами и двоичными файлами (см. Стандарт ISO C), многие утилиты производят только предсказуемый или значимый вывод при работе с текстовыми файлами. Стандартные утилиты, имеющие такие ограничения, всегда указывают «текстовые файлы» в своих разделах STDIN или INPUT FILES.
Источник: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403
Однако есть несколько вещей, которые я нахожу неясными:
Должен ли текстовый файл быть обычным файлом? В приведенном выше отрывке явно не говорится, что файл должен быть обычным файлом.
Может ли файл считаться текстовым файлом, если он содержит только один символ и только один символ (т. Е. Один символ, который не заканчивается новой строкой)? Я знаю, что этот вопрос может звучать неприметно, но они используют слово «символы» вместо «один или несколько символов». Другие могут не согласиться, но если они имеют в виду «один или несколько символов», я думаю, что они должны явно сказать это
В приведенном выше отрывке он ссылается на «строки». Я нашел четыре определения со строкой в их названии: «Пустая строка», «Показать строку», «Неполная строка» и «Строка». Должен ли я сделать вывод, что они означают «Строка» из-за пропуска слов «Пусто», «Показать» и «Неполный» - или все четыре из этих определений включительно считаются строкой в приведенном выше отрывке?
Все вопросы, которые возникают после этого блока текста, зависят от вывода, что «символы» означают «один или несколько символов»:
- Можно ли с уверенностью заключить, что если файл пустой, это не текстовый файл, поскольку он не содержит один или несколько символов?
Все вопросы, которые возникают после этого блока текста, зависят от того, что в приведенном выше фрагменте строка определена как «Строка», и что три других определения, содержащие «Строку» в их названии, должны быть исключены:
Означает ли «ноль» в «нуле или более строках», что файл все еще можно считать текстовым файлом, если он содержит один или несколько символов, которые не заканчиваются символом новой строки?
Означает ли «ноль или более строк», что когда в игру вступает одна «Строка» (0 или более символов плюс завершающий символ новой строки), становится недопустимым, когда последняя строка является «Неполной строкой» (одна или несколько символы новой строки в конце файла)?
Означает ли, что «ни одна [никакая строка] не может превышать {LINE_MAX} байт в длину, включая символ новой строки», означает ли это ограничение на количество символов, допустимое для любой данной «строки» в текстовом файле (кроме этого, значение LINE_MAX в Ubuntu 18.04 и FreeBSD 11.1 - это "2048")?
Ответы:
Нет; выдержка даже специально отмечает стандартный ввод как потенциальный текстовый файл. Другие стандартные утилиты, такие как
make
, в частности , использовать в символьный файл/dev/null
в виде текстового файла .Этот символ должен быть <newline>, или это не строка , и поэтому файл, в котором он находится, не является текстовым файлом. Файл, содержащий ровно байт 0A, является однострочным текстовым файлом. Пустая строка является допустимой строкой.
Это на самом деле не вывод, а просто то, что говорится. Слову «линия» дано контекстно-соответствующее определение, и это то, о чем идет речь.
Пустой файл состоит из нуля (или более) строк и, таким образом, является текстовым файлом.
Нет, эти символы не организованы в линии.
Это не незаконно , это просто не текстовый файл. Утилита, требующая передачи текстового файла, может вести себя неблагоприятно, если вместо этого предоставляется этот файл.
Да.
Это определение просто пытается установить некоторые границы того ,
grep
что определенно будет принимать текстовая утилита ( например, ) - и ничего более. Они также могут свободно принимать вещи более свободно, и довольно часто они делают это на практике. Им разрешается использовать буфер фиксированного размера для обработки строки, предполагать, что новая строка появляется до ее заполнения, и так далее. Вы можете читать слишком много вещей.источник
printf "a" > file
бы создать текстовый файл в соответствии с этим определением. Ваш ответ на 4, кажется, противоречит вашим ответам на 2 и 5, так как вы предлагаете, чтоtouch file
создает текстовый файл, аprintf "a" > file
не.(.{0,M}\n)*
(неявно закреплен и имеет оба конца), где\n
соответствует.
символу новой строки и соответствует любому символу, который не является символом новой строки, иM
является заполнителем для числового значения. LINE_MAX-1. В частности, это означает, что пустой файл является допустимым текстовым файлом, состоящим из нулевых строк, но любой непустой текстовый файл должен заканчиваться символом новой строки (поскольку в противном случае он будет содержать неполную строку, а неполная строка не является строкой )./dev/null
- пустой файл. Вы думаете о/dev/zero
./dev/null
читается как пустой, так как вы не получаете данных, когда читаете его. Я не уверен, что имеет смысл рассматривать нестандартные файлы здесь, поскольку многие из них имеют динамический характер. Это включает в себя каналы, сокеты, символьные устройства, которые в основном являются просто транспортными интерфейсами к / от какого-либо другого объекта. Они не содержат статического набора данных, поэтому имеет смысл рассмотреть свойства данных, которые были переданы, а не свойства файла .Как определено POSIX:
Да, текстовый файл (в основном):
Было бы полезно также включить следующие определения:
3.92 Строка символов
3.195 Неполная линия
3.206 Линия
3.243 Символ новой строки (<новая строка>)
3.247 NUL
Обратите внимание, что «Текстовый файл» не должен содержать байтов NUL.
Так:
Нет, так не должно быть. «Текстовый файл» определяется с точки зрения того, что он содержит при чтении. Если файл содержит «ноль или более строк», это текстовый файл. Некоторые файлы, например
/dev/stdin
, могут содержать текстовый файл, если они читаются за один раз, а не при следующем чтении.Нет, это неполная строка (3.195).
Текстовый файл должен иметь только неполную строку.
Да, ты должен.
Нет, пустой файл (ноль символов) является допустимым «текстовым файлом».
Сверху: … ноль или более строк… . Ноль строк (ноль символов) является допустимым «Текстовым файлом».
Нет, «Неполная линия» не является (технически) действительной «строкой».
Означает ли «ноль» в «нуле или более строках», что файл все еще можно считать текстовым файлом, если он содержит один или несколько символов, которые не заканчиваются символом новой строки?
Нет, неполная строка не является «линией». Текстовый файл не должен содержать неполных строк.
... есть ограничение на количество символов, разрешенных в любой данной "строке" в текстовом файле ...?
Да, в любой строке допустимого «текстового файла» должно быть разрешено не более {LINE_MAX} байтов (в отличие от символов).
Значение {LINE_MAX} дается в файле <limit.h>
(также читайте Размер буфера в формате разумных строк в C? ):
Для системы на основе GNU не существует установленного ограничения (кроме памяти) :
Кажется, он определен
posix_lim.h
как 2048 (по крайней мере для 64-битных систем Linux Linux):Его также можно найти с помощью утилиты POSIX getconf :
Связанный: Почему текстовые файлы должны заканчиваться символом новой строки?
источник
file
Утилита сообщает только тип файла для специальных файлов, но это только как подсобные работы, использованиеfile - <…
или (Linux) ,file -s …
чтобы увидеть его эвристики на содержимое файла для специального файла. Каждый раз, когда вы открываете его, специальный файл может иметь различное содержимое, поэтому он может быть или текстовым файлом каждый раз./dev/null
всегда текстовый файл, потому что его содержимое всегда является текстовым файлом.grep
файлы, вы можете использоватьgetconf
для получения системных значений conf, напримерgetconf LINE_MAX
, которые, кстати, возвращают 2048 (байт) в моей системе (Ubuntu 16.04).getconf
позволяет прочитать текущее значение конфига.