[unix] 파일의 마지막 문자는 무엇입니까?

방금 “파일 끝에서 줄 바꿈 문자 제거”에 대한 답변을 읽었으며 모든 사람이 마지막 문자를 삭제하라고 말했습니다. 내 질문은, eof 캐릭터가 마지막 캐릭터가 아닌가?



답변

이전 응답의 상태가 올바르므로 파일이 파일 끝 문자로 끝나지 않습니다. 그러나 답변과 의견에는 지적 할 가치가있는 부정확성이 포함되어 있다고 생각합니다.

  • ASCII 문자 세트에는 정확한 EOF 문자가 포함되어 있지 않습니다. 텍스트 끝 (3), 전송 끝 (4), 전송 끝 블록 (23), 매체 끝 (25)과 같은 여러 “종료”제어 문자가 있습니다. 파일 구분 기호 (28)는 EOF 문자에 가장 가깝습니다. 코드 26은 EOF가 아닌 “대체”입니다.

  • CtrlD터미널 입력에만 연결됩니다. 예를 cat filea fileb filec > outfile들어이 명령
    에는 Ctrl– 가 포함되지 않습니다 D. 그건 그렇고, 당신보다 뭔가 다른 터미널 EOF 문자를 변경할 수 있습니다 CtrlD사용하여 stty명령을.

  • 엄밀히 말해서 CtrlD(또는 변경 한 것)은 EOF 키 코드가 아닙니다. 그것이하는 것은 readreturn을 누르면 시스템 호출이 호출자에게 한 줄의 문자를 리턴하는 것처럼 시스템 호출을 입력이 가능한 상태로 리턴하는 것입니다. 통상적 으로, 판독 시스템 호출 (즉, 제로 문자 판독)로부터의 리턴 값 0은 파일의 종료 조건을 신호한다. 그러나 입력 파일은 자동으로 닫히지 않으며 입력이 터미널에서 오는 경우 “파일 끝”상태가되지 않습니다. “파일 끝”이후에도 터미널에서 계속 읽는 프로그램을 작성할 수 있으며 읽기 호출은 다음 입력 행에 대해 0이 아닌 값을 리턴 할 수 있습니다.

  • eof 문자와 eol 문자의 유추는 일부 입력이 이미 행에 쓰여져있을 때 CtrlD를 누르면 볼 수 있습니다 . 예를 들어, “ABC”와 언론 작성하는 경우 CtrlD읽기 호출이 반환, 3 및 인수로 전달 된 버퍼에 저장 “ABC”와 반환 값이 시간을. read는 0을 반환하지 않으므로 위의 규칙에 따라 EOF 조건으로 해석되지 않습니다. 마찬가지로 Return 키를 누르면 전체 입력 행 (줄 바꿈 포함)과 함께 읽기 호출이 반환됩니다. 이 cat명령 을 사용하여 시도해 볼 수 있습니다 . 행에 일부 문자를 쓰고 Ctrl-를 누르십시오 D. 문자가 다시 에코되고 cat더 많은 입력을 기다리는 것을 볼 수 있습니다.

  • 위의 모든 내용은 라인 입력 처리가 최소화되는 “raw”모드와 달리 터미널이 “cooked”모드 인 경우에만 적용됩니다. 원시 모드에서 Ctrl-D 문자는 실제로 입력 버퍼로 전달됩니다.


답변

ASCII 제어 문자에는 1960 년대의 정의가 있습니다 (실제로 네트워크를 고려할 수있는 것보다 앞서 있습니다 ). 이러한 제어 문자가 모두 통신 장비에 대해 정의 된 방식으로 사용되는 것은 아닙니다.

유닉스 계열 시스템에서는 EOF캐릭터 가 필요하지 않습니다 . 사용되지 않습니다. 시스템은 파일에 몇 바이트가 있는지 응용 프로그램에 알려줄 수 있습니다.

  • VMS, DOS, Windows에서 볼 수있는 일부 다른 시스템에서는 control-Z가 파일 끝 표식으로 작동 할 수 있습니다. 이전 버전에서는 시스템이 일부 응용 프로그램에 파일에 몇 바이트가 있는지 알 수 없었기 때문입니다 .

    VMS의 경우 제한은 C 런타임이 작동하는 방식 때문이었습니다. 어셈블리 언어 응용 프로그램은 올바른 파일 크기를 얻을 수있었습니다.

  • 쉘의 유닉스 시스템은 일반적으로 control-D를 사용하여 입력 끝 (파일)에 도달했지만 control-D는 파일에 저장되지 않았다는 것을 응용 프로그램에 알립니다.

C에서는 EOF의도적으로 -1유효한 문자가 아님을 나타 내기 위해 만들어졌습니다 . EOF파일 끝 조건이 감지되면 특수 문자가 아닌 표준 I / O가 반환 됩니다.

그건 그렇고, 파일은 개행 (ASCII 줄 바꿈) 문자로 끝나지 않아도 됩니다. 텍스트 편집기는 모두 인쇄 가능한 텍스트이지만 후행 줄 바꿈이없는 파일을 처리 할 수 ​​있습니다.


답변

EOF는 문자가 아닙니다. 파일 스트림에서 읽을 문자가 더 이상 없음을 나타내는 상태입니다. 터미널에서 EOF 명령을 입력하면 특수 문자를 입력하지 않고 OS에 입력 스트림을 닫으라고 신호합니다.


답변