EOF는 end-of-file의 약자로, 파일의 끝에 도달했음을 알리는 상수이다.
C++에서는 cin.eof()를 이용하여 파일의 끝에 도달했는지 판단한다. 파일이 끝이 맞으면 true
, 아니면 false
를 반환한다.
마지막 문자를 읽은 다음에 다시 한번 읽기를 시도했을 경우, EOF라고 판단한다.
예를 들어 jeong
이라는 문자열이 입력으로 주어지고, 한 문자씩 읽어온다고 가정하자.
jeong
은 5개의 문자로 이루어진 문자열이므로, 5번 읽어올 수 있다.
char c;
for(int i=0;i<5;i++)
cin >> c;
이 다음 cin.eof()
를 수행시키면 true
를 반환할까 false
를 반환할까?
답은 false
이다.
앞서, 마지막 문자를 읽은 다음에 다시 한번 읽기를 시도했을 경우, EOF
라고 판단한다고 하였다. 현재 코드의 경우 마지막 문자까지만 읽은 후 다시 한번 읽지 않았다.
만약, 위의 예제에서 cin.eof()
가 true
값이 되도록 하고 싶다면, 아래와 같이 변경해야 한다.
char c;
for(int i=0;i<5;i++)
cin >> c;
cin >> c // 한번 더 읽어주기!
cout << cin.eof();
이렇게 입력값을 다 읽고 한번 더 읽어주었을 때, 그제서야 EOF
라고 판단하게 된다.
앞의 예제에서는 입력값의 길이를 알고 있었다. 사실, 입력값의 길이를 모르는 상태에서 "파일 끝에 도달할 때까지 출력해주세요~" 하는게 일반적이다. 이런 경우에는 아래와 같은 코드를 활용하면 된다.
char a;
while(!(cin >> a).eof){ // 이렇게!
cout << a;
}
마지막 값을 읽고 난 뒤, 한번더 읽어야지 EOF
이므로 cin >> a
으로 한번 읽고 난 뒤, .eof()
를 이용하여 EOF
임을 판단하는 것이다.
위의 코드를 아래 처럼 더 간결하게 변경할 수 있다.
char a;
while(cin >> a){ // 간결하게!
cout << a;
}
왜 이렇게 할 수 있을까?
원래 스트림 연산을 한 뒤에는 스트림 객체를 반환한다. → 그렇기 때문에 (cin >> a).eof()
같은 연산이 가능했던 것!
그러나 스트림이 조건문 안에 들어가게 되면, 스트림 객체가 아닌 bool타입
을 반환하게 된다.
스트림이 정상상태일 때는 true
, 정상이 아닐 때, 즉 EOF
에 도달하였을 때는 false
를 반환한다.
따라서, 이러한 원리로 인해 위와 같이 간결하게 나타낼 수 있게 된다.
eof에 대한 내용을 직접 적용해보고 싶다면, 백준 #10951 문제를 풀어보자. 백준 #10951 에 대한 풀이가 궁금하다면 여기로!
참고 링크 : https://st-lab.tistory.com/257
while(cin >> a) 이렇게 해도 되는 줄은 몰랐네요 감사합니다!