[C++] EOF 처리하기 (계속되는 테스트 케이스)

E woo·2022년 8월 10일
0

개발 일기

목록 보기
10/15

EOF


End of File 의 약자이고 파일의 끝에 도달했을 때로 이를 입력으로 생각한다면
하나의 입력을 끝냈을 때로 생각할 수 있다.

파일의 끝이 맞는 경우에는 true 를 파일의 끝이 아닌 경우에는 false 반환한다.

이때 주의해야 할 점은 정말 파일의 끝에서 판단하여 반환하는 것이 아닌 파일의 끝 다음에 읽을 수 있는 데이터가 없는 경우에 반환한다는 것이다.

예를 들어 hello 의 문자열을 입력했다면 o 에서 eof를 반환하는 것이 아닌 o 다음에 읽을 데이터가 없는 경우에 반환한다는 것이다.

즉, 더 이상 읽을 데이터가 없을 경우인 것이다.

EOF 판단하기


입력으로 사용되는 테스트 케이스가 여러 개 들어오는 상황이라면 특별한 조건이 없는 경우에는
입력 데이터 형에 맞지 않거나 혹은 입력에 에러가 발생하기 전까지 입력이 계속되어야 한다.

💿 scanf


scanf 는 기본적으로 알맞게 입력받은 데이터의 개수를 반환하고 올바르지 않은 입력으로 EOF 가 발생한 경우에는 -1 (==EOF) 를 반환한다.
이를 이용해 while 문으로 계속되는 테스트 케이스를 처리할 수 있다.

	int n;
	while(scanf(%d, &n) != -1)
    {
    	printf("%d", n);
    }

이를 이용하면 정수 int 형이 아닌 입력에 대해서는 반환값 EOF 를 가지게 된다.

💿 cin


cin.eof() 를 통해 해당 입력의 EOF 를 판단할 수 있는 데 주의해야 할 점이 있다.

	int n;
	while(!cin.eof())
    {
    	cin >> n;
    }

다음과 같이 while 문의 조건으로 cin.eof() 를 사용하면 cin 에 대한 EOF 를 확인하는 것으로 만약 입력 값이 올바르지 못한 경우나 파일의 끝에 도달한 경우 true 를 반환하므로 이에 대한 not 을 통한 구현이 맞아보일 수 있다.

하지만 .eof() 는 마지막으로 들어온 입력에 대한 EOF 를 판단하기 때문에 만약 1 을 입력하고 a 를 입력했다면 a 를 입력 받은 후에야 while 문의 조건에서 EOF 를 판단하기 때문에 a 에 대한 올바른 시점에 EOF 판단을 하지 못하게 된다 따라서

	int n;
	while(!(cin >> n).eof())
    {
    	cout >> n;
    }

입력을 받은 직후 바로 EOF 를 판단해야 된다.

이 방법 외에도 cin 은 입력 값에 맞는 자료형이 들어온 경우 true 를 반환하지만
그렇지 않은 경우 false 를 반환하는 것을 이용할 수 있다.

	int n;
    while(cin >> n)
    {
    	cout << n;
    }

💻 구현 예시


백준 10951번 : A + B - 4
https://www.acmicpc.net/problem/10951

#include <iostream>

using namespace std;

int main()
{

    int a,b;

    while(cin >> a >> b)
    {

        cout << a + b << "\n";
    }
}

계속 테스트 케이스를 넣어주어야 하는 데 알아서 입력하다가 끊는다는 건가...?? 싶어서 그냥 제출하기를 반복하다가 진짜 계속 넣어줘야 하는 구나~ 라고 깨닫기까지 오래 걸렸따...
profile
뒘벼

0개의 댓글