이번 08년 2학기 프로그래밍 언어 및 실습 과제 pa4 에서 EOF 로 종료하도록 했다는 군...
해서 이번에 내 블로그에 올렸었던 내용을 여기에도 올려둘테니 함 봐봐...(물론 기한이 지났긴 하지만...ㅋㅋ)
출처 : http://blog.naver.com/howmistake/100056208919
======================================================================================================
EOF대부분 cin.eof 를 사용하는 경우는 두 가지일 것이다.
아무 생각없이 파일을 읽는 데에 사용하거나 과제의 요구사항에 EOF 입력 시에 종료하라거나
.
물론 파일을 읽을 때에는 cin.getline 함수를 이용하니까 여기선 잠시 제껴두고...
이번에는 과제할 때 은근은근히 도움이 되는 cin.eof 활용에 대해 포스팅을 할까 한다.
일단, std::cin 은 보다시피 namespace std 안에 class cin 이 정의되어 있다.
그리고 그 안에 cin.eof 라고 class cin 의 member function 이 정의되어 있다.
즉, 우리는 C를 할 때처럼 ' ==EOF ' 식으로 쓰는 게 아니라 ' ==cin.eof() ' 를 활용해야 할테다.
문제는 여기서부터다.
아마 cin.eof() 를 사용하기 위해 웹 검색을 한 사람이라면 나름의 해법을 한두개씩은 봤을 것이다.
하지만 제대로 되는 게 없다....! (필자가 발견한 방법이 4종류 정도 되는데, 다 안됐다)
기본적으로 class cin 은 초기값이 EOF(파일 끝) 이다. 왜 초기값이 EOF냐면,
cin 은 파일 입출력에서도 사용하기 때문이다(scanf 같다라기 보단 fscanf에 가깝다고 볼 수 있다)
아예 stdin 에서 파일 읽기를 시작하지 않았으니 어쩌면 EOF가 초기값인 건 당연하다.
※stdin(standard input)은 키보드로 입력한 버퍼들이 저장된 일종의 '파일'이며, C에선 scanf 를 사용한 뒤에 반드시 fflush(stdin) 을 사용해 버퍼를 비워줘야한다....혹시나 해서 적어둠.
또한 C++ 에서 overloading 이 가능해져서 그냥 같은 이름으로 이리저리 쓸 뿐이다.(편하게)
그런데 웃긴 점은 cin.fail() 값과 cin.eof() (둘 다 bool형 함수) 가 둘다 false 란 점이다.
이 함수가 생성된 목적은 '사용자가 cin을 사용한 후에 잘못읽거나(fail) 파일 끝일 때(eof) true 반환'
을 위해 만들어진 함수다.
때문에 사용자가 eof 를 입력하면 EOF 를 받고난 뒤에서야 cin.eof()와 cin.fail()이 true 가 된다.
하지만 우리는 EOF 를 한 번 입력한 뒤에 바로 작동이 되어야 한다.
즉, cin.eof() 를 이용해 EOF 를 사용할 수 없다는 것이다...
그리하여 결국 msdn 을 뒤져봤다.
그리고 찾았다!!!!!!
결론적으로 말하자면 'cin.eof()' 를 사용할 수 없다. 이 함수는 파일 읽기 전용...이라고 보면 된다.
EOF 를 사용하려면 다르게 해야 한다.
바로 cin.get() 이다.
cin.get() 은 int형 함수로 딱 한 글자만 int로 받아서 리턴한다. 여기서 한 글자라 의미하는 것은
char형의 한 글자를 의미하며, (char) 등으로 형변환하여 사용할 수 있다는 의미다.
※예를 들어 asd라 입력하면 a 만 들어간다....물론 못 믿겠다면 해보길
또한 signed int형 범위 만큼의 정수값도 받아서 리턴할 수 있다.
(...뭐 거의 우리와 같은 고민을 덜어주기 위해서 만든 듯한 느낌도 든다;;)
하여서 소스를 캡쳐했다.
![이미지를 클릭하면 원본을 보실 수 있습니다.](https://t1.daumcdn.net/cafefile/pds103/1_cafe_2008_10_25_09_16_4902655ece3db)
위의 함수를 간략하게 설명해 보겠다. 어차피 다 각설하고 오직 EOF 만을 위해 만든 workspace 라서
매우매우매우매우매우매우매우매우매우매우매우매우매우매우매우매우매우매우매우매우매우 짧다.
while 부분의 조건식을 살펴보자.
while( (i = cin.get() ) != EOF )
cin.get() 의 반환값을 변수 i 에 넣었을 때, 그 값이 EOF 가 아닐 때까지 반복한다는 의미다.
간단하지 않은가? 이 정도면 부담없이 과제에 활용할 수 있을만 하다.
하지만 우리가 해야 할 과제는 생각보다 녹녹치 않다.
![이미지를 클릭하면 원본을 보실 수 있습니다.](https://t1.daumcdn.net/cafefile/pds103/3_cafe_2008_10_25_09_16_49026549bff2d)
결과값.....
출처
EOF 사용법 - MSDN online
(http://social.msdn.microsoft.com/Forums/ko-KR/vcgeneral/thread/ec62b00c-5501-48ed-bca4-daef699cafed/)
iostream 에 정의된 함수 내용 - 지식iN
(http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&eid=KDlryV8aI4TKmoNDP81nngjVXz/+tt7A&qb=Y2lu&pid=fdaoFwoi5URssvmKc+4sss--501841&sid=SQFodqhkAUkAAFRgEK4)
첫댓글 참고로 말하자면 제목은 검색어를 고려해서 정했음...ㅋㅋ
ㅋㅋ 형 고맙습니다^^
굿.ㅡ.ㅡb