방금 다음 질문에 대한 답변을 읽었습니다.파일 끝에서 개행 제거다들 마지막 문자를 삭제하라고 하네요. 제 질문은 eof 문자가 마지막 문자가 아닌가요?
답변1
ASCII 제어 문자의 정의는 1960년대부터 시작됩니다(실제로 문자라고 생각하는 것보다 이전).회로망). 이러한 제어 문자 중 일부는 당시 통신 장비에 대해 정의된 방식으로 사용되지 않았습니다.
Unix 계열 시스템에서는 문자가 필요하지 않습니다 EOF
. 시스템은 파일이 몇 바이트인지 애플리케이션에 알려줄 수 있습니다.
일부 다른 시스템(VMS, DOS, Windows에 있음)에서는 Control-Z가 파일 끝 표시로 작동할 수 있습니다.나이가 많은시스템이 일부 응용 프로그램에 파일에 몇 바이트가 있는지 알 수 없는 버전입니다.
VMS의 경우 C 런타임 작동 방식으로 인해 제한이 발생합니다. 어셈블리 언어 응용 프로그램은 올바른 파일 크기를 얻을 수 있습니다.
유닉스 시스템에서껍데기일반적으로 control-D는 입력(파일)의 끝에 도달했음을 응용 프로그램에 알리는 데 사용되지만 control-D는 파일에 저장되지 않습니다.
C에서는 EOF
의도적으로 만들어졌는데-1
유효한 문자가 아님을 나타냅니다. EOF
파일 끝 조건이 감지되면 특수 문자 대신 표준 I/O가 반환됩니다.
그런데 파일이 다음으로 끝날 필요는 없습니다.새로운 팀(ASCII 개행) 문자. 텍스트 편집기는 인쇄 가능한 모든 텍스트가 있지만 후행 줄 바꿈이 누락된 파일을 처리할 수 있습니다.
답변2
이전 답변에서 올바르게 지적했듯이 파일은 파일 끝 문자로 끝나지 않습니다. 그러나 답변과 의견에는 지적할 가치가 있는 몇 가지 부정확성이 포함되어 있다고 생각합니다.
ASCII 문자 세트에는 정확한 EOF 문자가 포함되어 있지 않습니다. 여러 가지 "끝" 제어 문자가 있습니다: 텍스트 끝(3), 전송 끝(4), 전송 블록 끝(23), 매체 끝(25). 파일 구분 기호(28)는 아마도 EOF 문자에 가장 가깝습니다. 코드 26은 EOF가 아닌 "교체"입니다.
Ctrl- D단자 입력에만 해당됩니다. 예를 들어 이 명령에는 - 가
cat filea fileb filec > outfile
포함되지 않습니다 . 그런데 이 명령을 사용하여 터미널 EOF 문자를 -가 아닌 다른 문자로 변경할 수 있습니다 .CtrlDCtrlDstty
엄밀히 말하면 Ctrl- D(또는 무엇으로 변경하든)은 EOF 키 코드가 아닙니다. 그 목적은 return
read
키를 누르면 읽기 시스템 호출이 호출자에게 한 줄의 문자를 반환하는 것과 마찬가지로 시스템 호출이 사용 가능한 입력을 반환하도록 하는 것입니다.관례에 따르면읽기 시스템 호출의 반환 값 0(즉, 읽은 문자가 0인 경우)은 파일 끝 조건을 나타냅니다. 그러나 입력 파일은 자동으로 닫히지 않으며 입력이 터미널에서 오는 경우 "파일 끝" 상태가 되지 않습니다. "파일 끝" 이후에도 터미널에서 계속 읽는 프로그램을 작성할 수 있으며 읽기 호출은 입력의 다음 줄에 대해 0이 아닌 값을 반환할 수 있습니다.Ctrleof와 eol 문자 사이의 유사점은 행에 일부 입력이 기록될 때 -를 누르면 볼 수 있습니다. D예를 들어 "abc"를 쓰고 키를 누르면 읽기 호출이 반환 Ctrl되고 D이번에는 값 3이 반환되며 "abc"는 인수로 전달된 버퍼에 저장됩니다. 읽기는 0을 반환하지 않으므로 위의 규칙에 따라 EOF 조건으로 해석되지 않습니다. 마찬가지로 return 키를 누르면 읽기 호출이 전체 입력 줄(새 줄 포함)을 반환합니다. 다음 명령을 사용하여 이를 시도해 볼 수 있습니다
cat
. 행에 문자를 쓰고 Ctrl- 를 누르십시오 D. 문자가 다시 반향되는 것을 확인하고cat
추가 입력을 기다립니다.위의 모든 사항은 라인 입력 처리가 최소화되는 "raw" 모드가 아닌 "cooked" 모드에 있는 터미널에만 적용됩니다. 원시 모드에서는 Ctrl-D 문자가 실제로 입력 버퍼에 전달됩니다.
답변3
EOF는 문자가 아닙니다. 이는 파일 스트림에서 더 이상 문자를 읽을 수 없음을 나타내는 상태입니다. 터미널에서 EOF 명령을 입력하면 특수 문자를 입력하는 대신 운영 체제에 입력 스트림을 닫으라는 신호를 보내는 것입니다.