달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'clear'에 해당되는 글 1건

  1. 2007.08.04 [cpp] fstream::getline() 쓸 때 clear()를 꼭 쓰자

열심히 코딩을 잔뜩 한 후에 컴파일 하고 나서 알 수 없는 결과에 당혹해 하다가,
디버깅 모드에서 추적한 끝에 getline()함수가 말썽인을 것을 알았다.

결론적으로 getline()함수를 이용할 경우,
한  번 이용한 다음에 다시 getline()함수를 이용하기 전에 clear()함수를 호출하는 것이 좋다.
그렇지 않을 경우 두 번째 호출한 getline()함수는 buffer에 "" 즉,  '\0'만을 저장한다.

왜 그런지 알아보기 위해서 getline()에 대해서 참고 페이지를 읽어보고
fail()과 bad()으로 failbit이나 badbit가 set되어 있는지 테스트 해 보았다.
bad()에서는 clear되어 있고 fail()에서는 set되어 있는 것으로 봐서는 failbit가 set되어 있는 것이었다.
그리고 아래는 getline()에 대해서 참고자료에서 알려준 failbit에 대한 설명 중 일부이다.
failbit - This is also set if the function stops extracting
             because n-1 characters were extracted

그러니까 한 마디로 말 해서 꽉 차게 읽으면 failbit가 발생한다는 것이다.

그리고 참고자료에 getline()에 대한 설명으로 아래와 같은 글이 있었다.
The extraction also stops if the end of file is reached in the input sequence or if an error occurs during the input operation.
그러니까 입력 과정 중에 에러가 나도 멈춘다는 것이다.

여하튼 buffer가 꽉 찰 것을 예상한 다면 clear()를 통해 두 번째 getline() 이후에는
error control stategoodbit 로 만들어 줘야 한다.
이는 file stream 뿐만 아니라 일반 키보드 입력 stream에서도 마찬가지이다.
아무튼 getline() 쓰고 buffer에서 읽었는데, 꽉 차면 다음 번엔 꽝이닷~

직접 참고 페이지에서 정보를 얻기 바란다.
fsream 참고 - http://www.cplusplus.com/reference/iostream/fstream/
istream::getline 참고 - http://www.cplusplus.com/reference/iostream/istream/getline.html
ios:clear() 참고  - http://www.cplusplus.com/reference/iostream/ios/clear.html

아래 코드는 이를 테스트 해보기 위해서 짠 코드이다.
ttt.txt 라는 파일을 열어서 제대로 열렸다면,
파일 끝까지 10bytes씩 읽어온다.

#include <iostream>
#include <fstream>
using namespace std;

#define MAX_BUF_SIZE 10

int main()
{
fstream fp;

fp.open("ttt.txt");    // fp.open("ttt.txt", fstream::in);  
char szBuffer[MAX_BUF_SIZE];
if (fp.is_open()) {  
do {
  fp.clear();
  fp.getline(szBuffer, MAX_BUF_SIZE);
}while(fp.gcount() == MAX_BUF_SIZE - 1);
}

fp.close();
return 0;
}

'Lang, Tool, Env' 카테고리의 다른 글

chroot  (0) 2008.04.06
임베디드 기초 교육 정리  (0) 2007.08.26
C 프로그래머가 알아야 할 것들  (1) 2007.05.16
CRC를 통한 error 검출  (0) 2007.05.16
do while(0) 을 이용한 goto 대체  (0) 2007.05.16
Posted by neodelicious
|