[10951] 백준 : eof(End-of-File) (C/C++)

지환·2022년 1월 2일
0

백준(C)

목록 보기
12/47

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력

각 테스트 케이스마다 A+B를 출력한다.

<풀이>

#include <stdio.h>

int main()
{

	int a, b; 
	while (scanf_s("%d %d" ,&a, &b) != -1)	 
	{
		printf("%d\n", a + b); 

	}return 0;
	
}

End-of-file에 대한 이해

  • 주어진 입력 파일만 갖고 입력을 받을 때 더이상 읽을 수 있는 데이터가 없는 경우 즉, 파일의 끝일 때 이를 EOF(End Of File) 이라고 한다.

  • 위 문제 입력에서 더이상의 읽을 수 있는 데이터가 존재하지 않을 때 반복문을 종료하라는 것이다. (참고로 우리는 일상적으로 문장의 끝을 Enter로 치지만, Enter(개행) 또한 하나의 '문자'다. Ascii 코드표를 보면 LF가 눈에 보이지는 않지만 개행을 하는 값이다.)

  • 즉, 입력 스트림이 더이상 읽을 것이 없는 파일의 끝에 도달했을 때를 처리해야한다는 것이다.

  • 파일의 끝까지 읽었다고 EOF가 되는 것이 아니다. 끝까지 읽고난 뒤 그 다음 파일을 읽으려 할 때 읽을 데이터가 없을 때 EOF가 되는 것이다. (시점을 정확히 파악해야한다.)

  • 예로들어 이렇다.

abcd<EOF>

위 순서대로 진행하면, 이렇게 진행된다.

  • 단순히 d까지 읽었다고 EOF가 되는 것이 아니라 끝에 도달 한 후 더 읽으려고 할 때 EOF가 된다고 보면 된다.

  • 참고로 에디터에서는 입력 파일을 따로 생성하여 읽지 않는 한 일반적인 키보드에서는 EOF키가 없어 EOF(입력 끝) 상태를 전송할 수가 없다.

  • 그 대신 키맵이 따로 있는데, 콘솔에서 윈도우의 경우 CTRL + Z를 입력해주면 되며 리눅스(유닉스) 계열은 CTRL + D를 눌러주면 된다.

scanf

  • stdio.h(혹은 cstdio)의 scanf의 경우는 int반환값이 존재한다. 반환값은 읽어들인 데이터의 개수를 반환하는데, 예로들어 scanf("%d %d %d, &a, &b, &c); 라고 했을 떄 지정한 포맷("%d")에 따른 3개의 변수에 알맞게 입력이 들어왔으면 3을 반환한다.
  • 만약 데이터를 읽는동안 파일의 끝(EOF)에 도달한 뒤 읽고자 하면 -1 을 반환한다. 즉 다음과 같이 작성할 수 있다.
    while(scanf_s("%d %d", &a, &b) != -1)






profile
아는만큼보인다.

0개의 댓글