ifstream::gcount가 0이로군요!!

purewell의 이미지

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)로 해도 결과는 마찬가지입니다.

무엇이 문제인가요.

bugiii의 이미지

gcount() 멤버함수가 왜 그런지는 모르겠지만, 사용하시려는 목적에는 readsome() 이라는 멤버함수가 있네요? 그 함수 리턴 값이 원하시는데 필요한 읽은 바이트 수 라고 하네요.

http://www.cplusplus.com/ref/iostream/istream/readsome.html

doldori의 이미지

EOF에 도달한 후 읽기를 시도하면 입력 스트림의 failbit가 켜지고 그 이후로는
스트림의 상태가 먹통이 된다고 보시면 됩니다. ifs.clear()를 호출하여 스트림의
상태를 리셋한 후 파일을 open 하세요.

익명 사용자의 이미지

doldori wrote:
EOF에 도달한 후 읽기를 시도하면 입력 스트림의 failbit가 켜지고 그 이후로는
스트림의 상태가 먹통이 된다고 보시면 됩니다. ifs.clear()를 호출하여 스트림의
상태를 리셋한 후 파일을 open 하세요.

^ -^)b 그렇군요.

bugiii의 이미지

그렇군요! doldori 님 말씀 잘 들었습니다. 하지만 purewell 님이 close 하고 open 을 다시 했는대도 그렇다는 것이 좀 이상하긴 합니다. close 라는 것이 ifstream 의 내부 상태를 완전히 초기화하는 것은 아닌가 봅니다.

doldori의 이미지

bugiii wrote:
close 라는 것이 ifstream 의 내부 상태를 완전히 초기화하는 것은 아닌가 봅니다.

네, 파일 스트림의 open()이나 close()는 버퍼를 위한 자원의 획득 및 해제,
locale 초기화 등을 할 뿐 스트림의 상태를 초기화하지는 않습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.