End of File 의 약자이고 파일의 끝에 도달했을 때로 이를 입력으로 생각한다면
하나의 입력을 끝냈을 때로 생각할 수 있다.
파일의 끝이 맞는 경우에는 true
를 파일의 끝이 아닌 경우에는 false
반환한다.
이때 주의해야 할 점은 정말 파일의 끝에서 판단하여 반환하는 것이 아닌 파일의 끝 다음에 읽을 수 있는 데이터가 없는 경우에 반환한다는 것이다.
예를 들어 hello 의 문자열을 입력했다면 o 에서 eof를 반환하는 것이 아닌 o 다음에 읽을 데이터가 없는 경우에 반환한다는 것이다.
즉, 더 이상 읽을 데이터가 없을 경우인 것이다.
입력으로 사용되는 테스트 케이스가 여러 개 들어오는 상황이라면 특별한 조건이 없는 경우에는
입력 데이터 형에 맞지 않거나 혹은 입력에 에러가 발생하기 전까지 입력이 계속되어야 한다.
scanf
는 기본적으로 알맞게 입력받은 데이터의 개수를 반환하고 올바르지 않은 입력으로 EOF
가 발생한 경우에는 -1 (==EOF)
를 반환한다.
이를 이용해 while 문으로 계속되는 테스트 케이스를 처리할 수 있다.
int n;
while(scanf(%d, &n) != -1)
{
printf("%d", n);
}
이를 이용하면 정수 int 형이 아닌 입력에 대해서는 반환값 EOF
를 가지게 된다.
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";
}
}