ifstream::gcount가 0이로군요!!
글쓴이: purewell / 작성시간: 금, 2005/05/06 - 5:38오후
ifstream ifs; char pBuf[1024]; do { if ( ifs.is_open() ) { ifs.read(pBuf, 1024); if (!ifs.gcount()) ifs.close(); else cout.write(pBuf, ifs.gcount()); } else { ifs.open("AdultVideo.avi", ios::binary|ios::in); if (!ifs.is_open()) DieDieDie(); } } while(true);
위와 같은 별로 재미 없는 코드가 있습니다.
반복문을 쌩쌩 돌면서 파일이 열려 있지 않으면 열고,
열린 파일에서 데이터를 긁어와서 화면에 살짝쿵 뿌려줍니다.
문제는 gcount라는 녀석인데,
처음으로 반복문을 돌 때는 원하는 값이 깔끔하게 나옵니다.
그러나 데이터를 모두 읽어서 gcount가 '0'이 되어
파일을 닫고 다시 열면 그때부터 gcount가 무조건 '0'으로
나옵니다.
Quote:
$ uname -a
Linux eilinux 2.4.30 #2 SMP 2005. 04. 14. (목) 10:20:45 KST i686 GNU/Linux$g++ --version
g++ (GCC) 3.3.5 (Debian 1:3.3.5-5)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
혹시나...
close-open하지 않고 seekg(0,ios::beg)로 해도 결과는 마찬가지입니다.
무엇이 문제인가요.
Forums:
gcount() 멤버함수가 왜 그런지는 모르겠지만, 사용하시려는 목적에는
gcount() 멤버함수가 왜 그런지는 모르겠지만, 사용하시려는 목적에는 readsome() 이라는 멤버함수가 있네요? 그 함수 리턴 값이 원하시는데 필요한 읽은 바이트 수 라고 하네요.
http://www.cplusplus.com/ref/iostream/istream/readsome.html
EOF에 도달한 후 읽기를 시도하면 입력 스트림의 failbit가 켜지고
EOF에 도달한 후 읽기를 시도하면 입력 스트림의 failbit가 켜지고 그 이후로는
스트림의 상태가 먹통이 된다고 보시면 됩니다. ifs.clear()를 호출하여 스트림의
상태를 리셋한 후 파일을 open 하세요.
[quote="doldori"]EOF에 도달한 후 읽기를 시도하면 입력
^ -^)b 그렇군요.
그렇군요! doldori 님 말씀 잘 들었습니다. 하지만 purewell
그렇군요! doldori 님 말씀 잘 들었습니다. 하지만 purewell 님이 close 하고 open 을 다시 했는대도 그렇다는 것이 좀 이상하긴 합니다. close 라는 것이 ifstream 의 내부 상태를 완전히 초기화하는 것은 아닌가 봅니다.
[quote="bugiii"]close 라는 것이 ifstream 의 내
네, 파일 스트림의 open()이나 close()는 버퍼를 위한 자원의 획득 및 해제,
locale 초기화 등을 할 뿐 스트림의 상태를 초기화하지는 않습니다.
댓글 달기