fread 재밋는 사실..

gloomyr의 이미지

몰랐던 사실인데 fread에 한번에 읽어오는 크기에 제한이 있나요? ㅋㅋ

---> fread((void*)des,6080,1,*fp) fread함수는 성공이지만 실질적으로 다 읽어오지 못하더군요
다른 문제도 발생하구요 printf(""); 하면 함수는 성공하지만 콘솔창에 뿌리지는 않더군요 ㅋㅋ 버퍼에 차있어서 그런가요?

---->fread((void*)des,64,1,*fp) 해서 95번 읽어오니 잘되더군요..

fread에서 한번에 읽어오는 사이즈가 제한되어 있는건가요??

neogeo의 이미지

OS 나 구현, 파일시스템등에 따라 다르지만 보통 OS 에서 page 단위는 4k 입니다.

fread 의 리턴값은 "읽어낸 바이트" 수 입니다. 항상 염두에 두고 프로그래밍 하시면 됩니다.

그리고 block 단위로 "여러번" 읽는 방법도 fread 인자로 존재합니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

gloomyr의 이미지

fread의 리턴값이 읽어온 바이트 수이진아요
리턴값은 6080 <<-- 성공한거 같은데
디버그모드로 돌려보면 정보 제대로 다 읽어오고 값도 다 차있고..
그런데
printf()가 안먹는다 이말이죠 ㅋㅋ
printf() 함수가 실행은 되는데 콘솔창에 뿌려지지가 않습니다.

아마 printf()가 쓰는 버퍼랑 fread가 쓰는 버퍼가 같은게 아닐가 유추해보지만
명확하지는 않네요 ㅋ

전웅의 이미지

아... fread() 와 관련된 문제는 아닙니다.
printf() 로 출력된 내용이 버퍼링되어서 그렇습니다.

(printf("hello"); 가 아니라 printf("hello\n"); 처럼) printf() 로
출력하는 내용이 newline 으로 끝나도록 해보시거나 printf() 후에
fflush(NULL); 을 삽입해 보시기 바랍니다.

--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

neogeo의 이미지

fread((void*)des,6080,1,*fp) 로 호출하셨으면 전웅님 말씀대로 6080 이 아니라 1이 리턴되는게 옳습니다.

그리고 flush 이외의 가능성을 찾아보자면 6080 바이트 안에 '\0' 이 하나라도 있는지 여부도 확인해보시기 바랍니다. 우연히 작은 단위로 잘랐을때 '\0' 이 맨뒤로 가서 잘 안보였을가능성도 있으니까요. ( printf 로 des 를 한번에 출력했을 경우에 해당하는 가능성입니다. )

Neogeo - Future is Now.

Neogeo - Future is Now.

gloomyr의 이미지

'\0'의 문제가 아니구
fread()실행후에
그밑에부터는
printf("aaaa\n"); 등 무슨짓을 해도 출력이 안된다 이거죠
fprintf(stdout,"aaaasjklf\n"); 등의 무슨짓을해도 printf는 출력문이 안나오죠
하지만 리턴값은 printf는 성공입니다. ``

전웅의 이미지

(C 표준 수정 제안과 관련된 문제로 문의 드립니다.)

fread((void*)des,6080,1,fp) 로 호출해 성공을 확인하셨다는 것은
반환값이 1 임을 확인하셨다는 뜻이지요? (6080-byte 짜리 item 1개를
읽어오라는 요청이고 반환값은 read 에 성공한 item 개수이므로 성공
이라면 1이 반환되었을 것입니다)

혹시 fread((void*)des,1,6080,fp) 이렇게도 수행해 반환값을 확인해
보셨나요?

두 경우 중 하나라도 (반환값과 무관하게) 제대로 못 읽어오는 경우가
있나요? 그렇다면 개발 환경에 대해 자세히 알려주시길 부탁드립니다.

[위에 답변 드렸듯이 fread() 와 관련된 문제는 아닙니다. 문의드린
내용은 무시하셔도 됩니다. ^^]

--
Jun, Woong (woong.jun at gmail.com)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

gloomyr의 이미지

(des,6080,1,fp) 리턴값은 0입니다.
(des,1,6080,fp) 의 리턴값은 4096입니다.

처음건 6080만큼 읽을려니 넘커서 실패한거같고
두번째꺼는 1바이트씩 6080번 읽을려고 하니 맥시멈이 4096 이라는 이야기 인가요?

제가 쪼금 착각을 했엇네요 ㅋㅋ

XP SP3 AMD VISUAL6.0
입니다.

전웅의 이미지

그렇다면 여전히 제가 예상했던 문제와 관련이 있습니다.

흠... fread() 전에 errno = 0; 을 해주시고 fread() 후에 errno 값을
알 수 있을까요?

#include <errno.h>
#include <string.h>
...
 
errno = 0;
printf("%d\n", (int)fread(des, 1, 6080, fp);
printf("%d:%s\n", errno, strerror(errno));

로 출력해주시면 됩니다.

MSVC 6.0 을 가지고 계신 분께 따로 부탁드렸었는데 결과는 4096 바이트
이상도 문제 없이 읽어서 재현이 되지 않습니다. (아마도 MS 쪽에서
일종의 bug 로 인식을 해서 SP 등을 통해 수정한 것 같은데 관련 history
를 찾기는 어렵군요.)

--
Jun, Woong (woong.jun at gmail.com)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

gloomyr의 이미지

흠 그렇군요
제가지금 출장을 와있어서
RHEL 5 gcc 4.~쓰고있어서 환경이 다른데서
해보니 흠 잘 성공하는군요 생각도 못햇는데
fread(des,1,6080,fp) ==> 6080
fread(des,6080,1,fp) ===-> 1

나중에 돌아가면 안되던 환경에서 결과 다시 올려드리겟습니다.

aruee의 이미지

그런데 어디에도 fread가 항상 요청한 데로 동작한다고 적혀있는것을 본적이 없는것 같습니다.

IO 의 경우 그 끝을 알수도 없고 device 때문에 언제든 실패할 수도 있는거니까요.

항상 IO제어는 귀찮고 힘들다는..

fread는 아니지만 예전에 설정파일 dump할때 중간중간에 sync를 안해주니까 파일이 다 깨져버린적이 있었지요. 흑.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.