파일을 바이너리로 열 때의 질문입니다.
글쓴이: cococo / 작성시간: 화, 2005/10/11 - 1:21오전
간단히 말하면, Window 의 O_BINARY 라는 옵션이 리눅스에는 무엇인지 찾아보고 있었는데, 결론은 없다는군요. 리눅스에서는 그냥 파일 열면 그게 바이너리 파일 모드라고 하던데요.
그런데...이해가 안되는 것이 있어 질문을 올립니다.
파일의 끝에는 모두 EOF가 있겠죠?
근데... 그 EOF 도 결국 이진 값의 하나일 것 아닙니까.
예를 들어, EOF가 0x00000000 이라고 하면, 만일 바이너리 파일의 내용 중 0이 나왔을 때랑, 파일 맨 끝의 EOF가 나왔을 때랑, 어찌 구별하죠?
또한, 이거 프로그램으로는 어찌 짜나요? 즉, 예를 들어 파일 복사 프로그램을 짤 때, 단순히
read(fd, buf, 1);
if (buf == EOF ) { printf(" end of file "); return 1; }
이렇게 꼴랑 EOF인가 아닌가만 쓰면 되는지요?
사실은 전에 에러가 난 적이 있는데, 이거 하다 하다 안되서 그냥 딴 방법으로 넘어갔던 기억이 납니다.
아시는 분 답변 좀 해 주시면, 정말정말 고맙겠습니다.
이상입니다. 건승하시는 하루 되시기 바랍니다.
Forums:
man page에서 read의 리턴값을 확인해 보시면좀더 나은 해결
man page에서 read의 리턴값을 확인해 보시면
좀더 나은 해결 방법이 떠오르실 겁니다.
man page 를 확인해 봤는데요
음. 그게요.
답변주신 분의 의도는, read했을때 0을 리턴하면 그걸 파일의 끝으로 봐도 된다는 말씀 같은데요.
그게... 의문점이라는 거죠.
그러니까, 0을 리턴했을 때, read()가 진짜로 아무것도 못 읽어서 0을 리턴한 건지, 아님 파일을 읽다가 중간에 0x00000000을 만나서 그걸 EOF로 인식하고 0을 리턴한 건지, 이걸 어떻게 판단하나요?
질문 내용이 부족해서 죄송합니다.
그럼 답변 기둘리겠습니다.
모두 행복한 하루 되시기 바랍니다. ^^
갑자기 생각나서...하나 더 추가합니다.
깜빡 했었는데...지금 만들라는 게 뭐냐면요. COM1, COM2 를 널모뎀 케이블 연결하고 서로 파일 전송하게 하려는 거거든요.
그래서... 만일 read가 0을 반환한다 하더라도, 그게
전송이 전부 끝나서 0을 반환하는 건지, 아님 전송 속도나 sender쪽의 속도가 느려서 0이 반환된건지 알 수 없지 않을까...하는데요.
단지 read가 0인 거만 체크하면 이런 경우도 처리( = sender쪽에서 데이터를 안 보내면 대기, 보낼 데이터가 없으면 0 ... 라는 식이 될까요?) 가 가능하나요? 아님 코드에서 따로 처리를 해 줘야 하나요?
음...자꾸자꾸 질문이 늘어나는 것이... ^^;;
현재 끝난 상태를 확인 해주는 함수가 따로 있습니다.feof()이건
현재 끝난 상태를 확인 해주는 함수가 따로 있습니다.
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);
Re: 파일을 바이너리로 열 때의 질문입니다.
파일의 끝에 EOF라는 문자는 없는걸로 알고 있습니다.
EOF라는 문자가 있다라면
위와 같이 했을 때 파일 사이즈가 1이어야 하지만 0 이거든요.
Re: 파일을 바이너리로 열 때의 질문입니다.
저도 EOF는 없는걸로 알고 있습니다.
운영체제에서 그렇게 리턴하는걸로만 알고있는데..
혹시 자세히 알고 계시는분 있나요?
Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.
stdio.h를 보면[code:1]#ifndef EOF# defi
stdio.h를 보면
로 정의되어 있군요..EOF를 리턴한다기 보다..파일 끝에 다다라서 더이상 읽을 수 없어서 에러(-1)를 리턴하면 EOF로 취급해서 처리하면 된다는거 같은데요..
----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ
답변 고맙습니다. 에러가 나면 그걸 파일의 끝으로 인식한다니...생
답변 고맙습니다.
에러가 나면 그걸 파일의 끝으로 인식한다니...생각도 못 해 봤습니다.
좋은 거 배워가네요. 답변 주신 분들 모두 고맙습니다.
행복하세요! ^^*
[quote]COM1, COM2 를 널모뎀 케이블 연결하고 서로 파일 전
chbcorp님 말씀대로 하실려면 select()나 polling() 등을 함께 쓰시는게 나을 것 같습니다만...
댓글 달기