C의 EOF (파일 끝)
저는 현재 Ritchie & Kernighan의 C Programming Language 책을 읽고 있습니다. 그리고 getchar()
함수 에서 EOF 사용에 대해 꽤 혼란 스럽습니다 .
먼저 EOF의 값이 -1이고 값 getchar()!=EOF
이 0 인 이유를 알고 싶습니다. 제 질문에 대해 죄송하지만 정말 이해가되지 않습니다. 정말 시도했지만 할 수 없습니다.
그런 다음 아래 코드를 사용하여 문자 수를 셀 수있는 책에서 예제를 실행하려고했지만 엔터를 눌러도 루프에서 벗어나지 않는 것 같아서 언제 EOF에 도달 할 수 있는지 궁금합니다.
main(){
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
그런 다음 Problem with EOF in C 에서 같은 문제를 읽었습니다 . 대부분의 사람들은 EOF 대신 터미네이터 \ n 또는 널 터미네이터 '\ 0'을 사용하는 것이 좋습니다.
이 책의 예가 다른 목적으로 사용된다는 의미입니까?
EOF는 "파일 끝"을 나타냅니다. 개행 (엔터를 누를 때 일어나는 일)은 파일 의 끝이 아니라 행 의 끝 이므로 개행이이 루프를 종료하지 않습니다.
코드가 틀린 것이 아닙니다 [*]. 예상 한대로 작동하지 않습니다. 입력의 끝까지 읽지 만 행의 끝까지 만 읽고 싶은 것 같습니다.
EOF의 값은 getchar
실제 문자의 반환 값과 달라야하므로 -1 입니다. 따라서 getchar
모든 문자 값을 부호없는 문자로 반환하고 int로 변환하므로 음수가 아닙니다.
터미널에 입력하고 파일 끝을 유발하려면 CTRL-D (유닉스 스타일 시스템) 또는 CTRL-Z (Windows)를 사용하십시오. 그런 다음 모든 입력을 읽은 후을 getchar()
반환 EOF
하므로 getchar() != EOF
false가되고 루프가 종료됩니다.
[*] 음, 정수 오버플로로 인해 입력이 LONG_MAX 문자 이상이면 정의되지 않은 동작이 있지만 간단한 예에서는이를 용서할 수 있습니다.
EOF는 -1입니다. 그것이 정의 된 방식이기 때문입니다. 이름은 표준 라이브러리 헤더에 의해 제공됩니다 #include
. 에서 읽은 실제 바이트로 착각 할 수없는 것이기 때문에 -1과 동일하게 만듭니다 getchar()
. getchar()
양수 (0 ~ 255 포함)를 사용하여 실제 바이트 값을보고하므로 -1이 제대로 작동합니다.
!=
조작 수단은 "동일하지 않은". 0은 거짓을 의미하고 다른 것은 참을 의미합니다. 그래서 우리는 getchar()
함수를 호출하고 그 결과를 -1 (EOF)과 비교합니다. 결과가 EOF와 같지 않으면 같지 않은 것은 같지 않기 때문에 결과는 참입니다. 결과가 EOF와 같으면 결과는 같지 않습니다 (같지 않음).
에 대한 호출 getchar()
은 "파일 끝"에 도달하면 EOF 를 반환합니다. C에 관한 한 '표준 입력'(명령 창에 입력하여 프로그램에 제공하는 데이터)은 파일과 같습니다. 물론 언제든지 더 많이 입력 할 수 있으므로 "완료"라고 말할 수있는 명시적인 방법이 필요합니다. Windows 시스템에서는 control-Z입니다. Unix 시스템에서는 control-D입니다.
책의 예는 "잘못"이 아닙니다. 실제로하고 싶은 일에 따라 다릅니다 . EOF까지 읽는다는 것은 사용자가 "완료"라고 말할 때까지 모든 것을 읽은 다음 더 이상 읽을 수 없음을 의미합니다. '\ n'까지 읽는 것은 입력 한 줄을 읽는 것을 의미합니다. 명령 프롬프트에서 키보드로이 바이트를 생성하는 것이 어렵거나 불가능하기 때문에 사용자가 입력을 입력 할 것으로 예상한다면 '\ 0'까지 읽는 것은 좋지 않습니다. :)
그것은 많은 질문입니다.
EOF
-1 인 이유 : 일반적으로 POSIX 시스템 호출에서 -1이 오류시 반환되므로 "EOF는 일종의 오류입니다"라고 생각합니다.어떤 부울 작업 (포함! =은) 그래서, 경우에 그것의 거짓에 사실 경우 1, 0을 반환
getchar() != EOF
이다0
그것의 FALSE는 의미 때getchar()
반환EOF
.언론
EOF
에서 읽을 때 모방하기 위해stdin
Ctrl+D
참조 URL : https://stackoverflow.com/questions/4358728/end-of-file-eof-in-c
'program tip' 카테고리의 다른 글
IntelliJ가 sbt 프로젝트를 가져올 수 없음 (0) | 2020.12.24 |
---|---|
클라이언트 측 자바 스크립트 시계를 서버 날짜와 동기화하는 가장 좋은 방법 (0) | 2020.12.24 |
git에게 인덱스 만 숨기라고 어떻게 말합니까? (0) | 2020.12.24 |
What does '&.' in '&.sub-title' indicates in scss? (0) | 2020.12.24 |
How do you “Mavenize” a project using Intellij? (0) | 2020.12.24 |