파일을 바이너리로 열 때의 질문입니다.

cococo의 이미지

간단히 말하면, Window 의 O_BINARY 라는 옵션이 리눅스에는 무엇인지 찾아보고 있었는데, 결론은 없다는군요. 리눅스에서는 그냥 파일 열면 그게 바이너리 파일 모드라고 하던데요.

그런데...이해가 안되는 것이 있어 질문을 올립니다.

파일의 끝에는 모두 EOF가 있겠죠?
근데... 그 EOF 도 결국 이진 값의 하나일 것 아닙니까.
예를 들어, EOF가 0x00000000 이라고 하면, 만일 바이너리 파일의 내용 중 0이 나왔을 때랑, 파일 맨 끝의 EOF가 나왔을 때랑, 어찌 구별하죠?

또한, 이거 프로그램으로는 어찌 짜나요? 즉, 예를 들어 파일 복사 프로그램을 짤 때, 단순히

read(fd, buf, 1);
if (buf == EOF ) { printf(" end of file "); return 1; }

이렇게 꼴랑 EOF인가 아닌가만 쓰면 되는지요?

사실은 전에 에러가 난 적이 있는데, 이거 하다 하다 안되서 그냥 딴 방법으로 넘어갔던 기억이 납니다.
아시는 분 답변 좀 해 주시면, 정말정말 고맙겠습니다.

이상입니다. 건승하시는 하루 되시기 바랍니다.

atomaths의 이미지

man page에서 read의 리턴값을 확인해 보시면
좀더 나은 해결 방법이 떠오르실 겁니다.

cococo의 이미지

음. 그게요.
답변주신 분의 의도는, read했을때 0을 리턴하면 그걸 파일의 끝으로 봐도 된다는 말씀 같은데요.

그게... 의문점이라는 거죠.
그러니까, 0을 리턴했을 때, read()가 진짜로 아무것도 못 읽어서 0을 리턴한 건지, 아님 파일을 읽다가 중간에 0x00000000을 만나서 그걸 EOF로 인식하고 0을 리턴한 건지, 이걸 어떻게 판단하나요?

질문 내용이 부족해서 죄송합니다.
그럼 답변 기둘리겠습니다.

모두 행복한 하루 되시기 바랍니다. ^^

cococo의 이미지

깜빡 했었는데...지금 만들라는 게 뭐냐면요. COM1, COM2 를 널모뎀 케이블 연결하고 서로 파일 전송하게 하려는 거거든요.
그래서... 만일 read가 0을 반환한다 하더라도, 그게
전송이 전부 끝나서 0을 반환하는 건지, 아님 전송 속도나 sender쪽의 속도가 느려서 0이 반환된건지 알 수 없지 않을까...하는데요.
단지 read가 0인 거만 체크하면 이런 경우도 처리( = sender쪽에서 데이터를 안 보내면 대기, 보낼 데이터가 없으면 0 ... 라는 식이 될까요?) 가 가능하나요? 아님 코드에서 따로 처리를 해 줘야 하나요?

음...자꾸자꾸 질문이 늘어나는 것이... ^^;;

서지훈의 이미지

현재 끝난 상태를 확인 해주는 함수가 따로 있습니다.
feof()이건 스트림에 사용하는 거라 적당히 변환 후 사용을 하시면 될것 같고요.
아니면 errno를 확인 하시면 끝난 상태가 어떤 상태인지 알 수가 있으니 이 둘중에 하나를 사용 하시면 깔끔 할것 같군요.
일단 man 2 read 하시면은 read() 의 에러 상황이 나오니 이걸 참고 하세요.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

익명 사용자의 이미지

ckbcorp wrote:

파일의 끝에는 모두 EOF가 있겠죠?
근데... 그 EOF 도 결국 이진 값의 하나일 것 아닙니까.
예를 들어, EOF가 0x00000000 이라고 하면, 만일 바이너리 파일의 내용 중 0이 나왔을 때랑, 파일 맨 끝의 EOF가 나왔을 때랑, 어찌 구별하죠?

파일의 끝에 EOF라는 문자는 없는걸로 알고 있습니다.
EOF라는 문자가 있다라면

touch a 
ls -al a 

위와 같이 했을 때 파일 사이즈가 1이어야 하지만 0 이거든요.
ctcquatre의 이미지

Anonymous wrote:
ckbcorp wrote:

파일의 끝에는 모두 EOF가 있겠죠?
근데... 그 EOF 도 결국 이진 값의 하나일 것 아닙니까.
예를 들어, EOF가 0x00000000 이라고 하면, 만일 바이너리 파일의 내용 중 0이 나왔을 때랑, 파일 맨 끝의 EOF가 나왔을 때랑, 어찌 구별하죠?

파일의 끝에 EOF라는 문자는 없는걸로 알고 있습니다.
EOF라는 문자가 있다라면

touch a 
ls -al a 

위와 같이 했을 때 파일 사이즈가 1이어야 하지만 0 이거든요.

저도 EOF는 없는걸로 알고 있습니다.
운영체제에서 그렇게 리턴하는걸로만 알고있는데..

혹시 자세히 알고 계시는분 있나요?

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

kall의 이미지

stdio.h를 보면

#ifndef EOF
# define EOF (-1)
#endif
로 정의되어 있군요..
EOF를 리턴한다기 보다..파일 끝에 다다라서 더이상 읽을 수 없어서 에러(-1)를 리턴하면 EOF로 취급해서 처리하면 된다는거 같은데요..

----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ

cococo의 이미지

답변 고맙습니다.
에러가 나면 그걸 파일의 끝으로 인식한다니...생각도 못 해 봤습니다.

좋은 거 배워가네요. 답변 주신 분들 모두 고맙습니다.
행복하세요! ^^*

atomaths의 이미지

Quote:
COM1, COM2 를 널모뎀 케이블 연결하고 서로 파일 전송하게 하려는 거거든요.
그래서... 만일 read가 0을 반환한다 하더라도, 그게
전송이 전부 끝나서 0을 반환하는 건지, 아님 전송 속도나 sender쪽의 속도가 느려서 0이 반환된건지 알 수 없지 않을까...하는데요.
단지 read가 0인 거만 체크하면 이런 경우도 처리( = sender쪽에서 데이터를 안 보내면 대기, 보낼 데이터가 없으면 0 ... 라는 식이 될까요?) 가 가능하나요? 아님 코드에서 따로 처리를 해 줘야 하나요?

chbcorp님 말씀대로 하실려면 select()나 polling() 등을 함께 쓰시는게 나을 것 같습니다만...

댓글 달기

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