[C++] EOF 판단하기

4877 단어 cppcpp

EOF란?

EOF는 end-of-file의 약자로, 파일의 끝에 도달했음을 알리는 상수이다.

EOF여부를 확인하는 법

C++에서는 cin.eof()를 이용하여 파일의 끝에 도달했는지 판단한다. 파일이 끝이 맞으면 true, 아니면 false를 반환한다.

언제 EOF라고 판단하는가?

마지막 문자를 읽은 다음에 다시 한번 읽기를 시도했을 경우, 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임을 판단하는 것이다.

TIP

위의 코드를 아래 처럼 더 간결하게 변경할 수 있다.

char a;

while(cin >> a){ // 간결하게!
	cout << a;
}

왜 이렇게 할 수 있을까?
원래 스트림 연산을 한 뒤에는 스트림 객체를 반환한다. → 그렇기 때문에 (cin >> a).eof() 같은 연산이 가능했던 것!

그러나 스트림이 조건문 안에 들어가게 되면, 스트림 객체가 아닌 bool타입을 반환하게 된다.
스트림이 정상상태일 때는 true, 정상이 아닐 때, 즉 EOF에 도달하였을 때는 false를 반환한다.

따라서, 이러한 원리로 인해 위와 같이 간결하게 나타낼 수 있게 된다.

마무리

eof에 대한 내용을 직접 적용해보고 싶다면, 백준 #10951 문제를 풀어보자. 백준 #10951 에 대한 풀이가 궁금하다면 여기로!

참고 링크 : https://st-lab.tistory.com/257

좋은 웹페이지 즐겨찾기