POSIX는 텍스트 파일을 다음과 같이 정의합니다.
0개 이상의 줄로 구성된 문자가 포함된 파일입니다. 이 줄에는 NUL 문자가 포함되지 않으며 <newline> 문자를 포함하여 {LINE_MAX}바이트보다 길 수 없습니다. POSIX.1-2017은 텍스트 파일과 바이너리 파일을 구분하지 않지만(ISO C 표준 참조) 많은 유틸리티는 텍스트 파일에서 작동할 때 예측 가능하거나 의미 있는 출력만 생성합니다. 이러한 제한이 있는 표준 유틸리티는 항상 STDIN 또는 INPUT FILES 섹션에 "텍스트 파일"을 지정합니다.
원천:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403
그러나 다음과 같은 몇 가지 불분명한 사항이 있다고 생각합니다.
텍스트 파일은 일반 파일이어야 하나요? 위의 발췌문에서는 파일이 일반 파일이어야 함을 명시적으로 명시하지 않았습니다.
파일에 단 하나의 문자(예: 개행으로 끝나지 않는 단일 문자)가 포함된 경우 텍스트 파일로 간주할 수 있습니까? 이 질문이 까다롭게 들릴 수도 있지만 "하나 이상의 문자" 대신 "문자"라는 단어를 사용합니다. 다른 사람들은 동의하지 않을 수도 있지만 "하나 이상의 문자"를 의미하는 경우 명시적으로 말해야 한다고 생각합니다.
위의 발췌문에서는 "라인"을 나타냅니다. 이름에 행이 있는 네 가지 정의("빈 행", "표시 행", "불완전한 행" 및 "행")를 찾았습니다. "empty", "shown" 및 "incomplete"를 생략했기 때문에 "line"을 의미한다고 추론해야 합니까? 아니면 위의 발췌문에서 네 가지 정의가 모두 한 줄로 간주됩니까?
이 텍스트 블록 이후에 발생하는 모든 질문은 "문자"가 "하나 이상의 문자"를 의미한다고 추론하는 데 달려 있습니다.
- 파일이 비어 있으면 하나 이상의 문자가 포함되어 있지 않으므로 텍스트 파일이 아니라고 안전하게 추론할 수 있습니까?
이 텍스트 블록 이후에 발생하는 모든 질문은 추론에 따라 달라집니다. 위의 발췌문에서 줄은 "Line"으로 정의되며 이름에 "Line"이 포함된 세 가지 다른 정의는 제외되어야 합니다.
"0개 이상의 줄"에서 "0"은 파일에 개행 문자로 끝나지 않는 하나 이상의 문자가 포함된 경우 해당 파일이 여전히 텍스트 파일로 간주될 수 있음을 의미합니까?
"0개 이상의 라인"은 단일 "라인"(0개 이상의 문자와 종료 개행 문자)이 시작되면 마지막 라인이 "불완전한 라인"(하나 이상의 불완전한 라인)이 된다는 것을 의미합니까? 파일 끝의 개행 문자)?
"없음[줄 없음]은 개행 문자를 포함하여 {LINE_MAX}바이트보다 길 수 없습니다"는 텍스트 파일의 특정 "줄"에 허용되는 문자 수에 제한이 있음을 의미합니다(btw, Ubuntu 18.04 및 FreeBSD 11.1 LINE_MAX). 은 "2048"입니다)?
답변1
텍스트 파일은 일반 파일이어야 하나요? 위의 발췌문에서는 파일이 일반 파일이어야 함을 명시적으로 명시하지 않았습니다.
아니요. 발췌문에는 표준 입력이 기본 텍스트 파일로 명시되어 있습니다. 기타 표준 유틸리티
make
.특정 용도이것캐릭터 특수 파일/dev/null
텍스트 파일로.파일에 단 하나의 문자(예: 개행으로 끝나지 않는 단일 문자)가 포함된 경우 텍스트 파일로 간주할 수 있습니까?
문자는 <newline>이어야 합니다. 그렇지 않으면 그렇지 않습니다.한 줄이므로 해당 파일은 텍스트 파일이 아닙니다. 정확히 0A 바이트를 포함하는 파일은 한 줄의 텍스트 파일입니다. 빈 줄은 유효한 줄입니다.
위의 발췌문에서는 "라인"을 나타냅니다. 이름에 행이 있는 네 가지 정의("빈 행", "표시 행", "불완전한 행" 및 "행")를 찾았습니다. "empty", "shown" 및 "incomplete"를 생략했기 때문에 "line"을 의미한다고 추론해야 할까요?
이것은 실제로 추론이 아니라 그냥 말하는 것입니다. 이 단어"라인"은 상황에 맞게 적절하게 정의되었습니다.그것이 바로 그 내용입니다.
파일이 비어 있으면 하나 이상의 문자가 포함되어 있지 않으므로 텍스트 파일이 아니라고 안전하게 추론할 수 있습니까?
빈 파일은 0개(또는 그 이상) 줄로 구성되므로 텍스트 파일입니다.
"0개 이상의 줄"에서 "0"은 파일에 개행 문자로 끝나지 않는 하나 이상의 문자가 포함된 경우 해당 파일이 여전히 텍스트 파일로 간주될 수 있음을 의미합니까?
아니요, 문자가 줄로 구성되어 있지 않습니다.
"0개 이상의 라인"은 단일 "라인"(0개 이상의 문자와 종료 개행 문자)이 시작되면 마지막 라인이 "불완전한 라인"(하나 이상의 불완전한 라인)이 된다는 것을 의미합니까? 파일 끝의 개행 문자)?
그렇지 않다불법, 그것은 단지 텍스트 파일이 아닙니다. 텍스트 파일을 제공하는 데 필요한 유틸리티가능한이 파일을 제공하면 바람직하지 않은 동작이 발생합니다.
"없음[줄 없음]은 개행 문자를 포함하여 {LINE_MAX}바이트보다 길 수 없습니다"는 텍스트 파일의 특정 "줄"에 허용되는 문자 수에 제한이 있음을 의미합니다.
예.
이 정의는 단순히 텍스트 기반 유틸리티에 대한 일부 경계를 설정하려고 시도합니다(예를 들어,grep
) 확실히 받아 들일 것입니다. 그게 전부입니다. 그들은 또한 사물을 더 자유롭게 받아들일 수 있으며 실제로는 그렇게 하는 경우가 많습니다. 줄 바꿈이 채워지기 전에 발생한다고 가정하면 고정 크기 버퍼를 사용하여 줄을 처리할 수 있습니다. 당신은 사물을 너무 많이 읽고 있을 수도 있습니다.
답변2
POSIX 정의에 따르면:
예, 텍스트 파일은 (기본적으로) 다음과 같습니다.
0개 이상의 줄로 구성된 문자가 포함된 파일입니다.
다음 정의를 포함하는 것도 유용합니다.
첫 번째 널 바이트로 끝나고 이를 포함하는 연속된 문자 시퀀스입니다.
파일 끝에 있는 하나 이상의 <newline>이 아닌 문자 시퀀스입니다.
0개 이상의 <newline>이 아닌 문자와 종료 <newline> 문자의 시퀀스입니다.
인쇄가 다음 줄의 시작 부분에서 시작되어야 함을 나타내는 출력 스트림의 문자입니다. C언어에서 '\n'으로 지정하는 문자입니다. 이 문자가 시스템이 다음 줄로의 이동을 완료하기 위해 출력 장치로 전송하는 정확한 시퀀스인지 여부는 지정되지 않습니다.
모든 비트가 0으로 설정된 문자입니다.
"텍스트 파일"은아니요NUL 바이트를 포함합니다.
그래서:
- 텍스트 파일은 일반 파일이어야 하나요?
아니요, 그럴 필요는 없습니다. "텍스트 파일"은 읽을 때 포함된 내용으로 정의됩니다. 파일에 "0개 이상의 줄"이 포함되어 있으면 텍스트 파일입니다. 일부 파일(예:/dev/stdin
)은 한 번 읽었지만 다음 번에는 텍스트 파일을 포함하지 않을 수 있습니다. - 파일에 문자 1개, 문자 1개만 포함되어 있는 경우... 텍스트 파일로 간주됩니까?
아니요, 이것은 불완전한 줄입니다(3.195).
텍스트 파일에는 "불완전한 줄"이 아닌 항목만 포함되어야 합니다. - "선"을 의미한다고 추론해야 할까요...?
예, 그래야 합니다. - 파일이 비어 있으면 텍스트 파일이 아니라고 안전하게 추론할 수 있나요...?
아니요, 빈 파일(문자 0개)은 유효한 "텍스트 파일"입니다.
위에서:...0개 이상의 라인.... 0행(0문자)은 유효한 "텍스트 파일"입니다. - ...개행으로 끝나지 않는 문자가 하나 이상 포함된 경우 텍스트 파일로 간주됩니까?
아니요, "불완전한 줄"은 (기술적으로) 유효한 "줄"이 아닙니다. "0개 이상의 줄"에서 "0"은 파일에 개행 문자로 끝나지 않는 하나 이상의 문자가 포함된 경우 해당 파일이 여전히 텍스트 파일로 간주될 수 있음을 의미합니까?
아니요, 불완전한 줄은 "줄"이 아닙니다. 텍스트 파일은아니요불완전한 줄이 있습니다....텍스트 파일의 특정 "라인"에 허용되는 문자 수에 제한이 있습니까?
예, 최대 {LINE_MAX}까지입니다.바이트(문자와 반대)은 유효한 "텍스트 파일"의 특정 줄에 나타날 수 있어야 합니다.
{LINE_MAX}의 값은 다음 수식으로 제공됩니다.파일 <limits.h>
(또한 읽어보세요C의 합리적인 라인 버퍼 크기?):{LINE_MAX}
달리 명시하지 않는 한, 유틸리티가 텍스트 파일을 처리하는 것으로 설명될 때 유틸리티 입력 라인(표준 입력 또는 기타 파일)의 최대 길이(바이트)입니다. 길이에는 후행 공백이 포함됩니다.
허용되는 최소값: {_POSIX2_LINE_MAX}GNU 기반 시스템의 경우 다음이 있습니다.설정된 제한 없음(메모리 제외):
매크로: int LINE_MAX
텍스트 지향 POSIX.2 유틸리티가 지원할 수 있는 최대 텍스트 줄입니다. (이러한 유틸리티의 GNU 버전을 사용하는 경우 사용 가능한 가상 메모리에 의해 부과되는 제한 외에는 실제 제한이 없지만 라이브러리에서는 이를 알려줄 수 없습니다.)2048 로 정의된 것 같습니다
posix_lim.h
(적어도 64비트 Linux GNU 시스템의 경우).$ grep -ri 'POSIX2_LINE_MAX' /usr/include/ /usr/include/x86_64-linux-gnu/bits/xopen_lim.h:#define NL_LANGMAX _POSIX2_LINE_MAX /usr/include/x86_64-linux-gnu/bits/posix2_lim.h:#define _POSIX2_LINE_MAX 2048 /usr/include/x86_64-linux-gnu/bits/posix2_lim.h:#define LINE_MAX _POSIX2_LINE_MAX
POSIX를 사용하여 찾을 수도 있습니다.유틸리티 getconf:
$ getconf LINE_MAX 2048