Tuesday, March 25, 2014

[Trouble shooting] c에서 binary 파일을 끝까지 읽지 못할 경우! fread

c에서 binary 파일을 fopen으로 열고, fread를 이용하여 데이터를 로드하였는데,
데이터를 끝까지 읽어들이지 못하고 중간에 멈추었다.


...
short inbuf;
FILE *fin = fopen("hello.pcm","r");
while( fread(&inbuf, sizeof(short),1, fin) ){
}
...


근래들어 MATLAB만 사용하다가 오랫만에 C를 사용해서 그런가
이런 말도 안되는 사소한 문제에 빠져서 헤매다가 드디어 해결!!


FILE *fin = fopen("hello.pcm","rb");

fopen() 함수는 기본 file mode가 TEXT 상태이다!!!
그렇기 때문에 모드를 생략하면 파일을 text로 open하는데,
내가 열려는 파일은 BINARY 파일이였던 것이다.

MATLAB에서는 알아서 파일에 맞는 모드로 파일을 열었었는데,
꼼꼼히 설정해 줘야 하는 C는 나에게 불만을 마구 표출하며 골탕먹였다.

MATLAB에 너무 길들여졌더니 이러한 실수나 하고...OTL



참고. FILE *fopen(const char *filename, const char *mode);

<file mode 종류>

택1, 생략 불가
r  : 읽기 위해 open. 기존에 파일이 존재하여야 함. 없으면 에러.
w : 쓰기 위해 open. 없으면 생성. 존재하면 파일 삭제 후 다시 생성.
a : 추가하기 위해 open. 없으면 생성, 존재하면 추가.
r+ : 읽기/쓰기 위해 open. 기존에 파일이 존재하여야 함.
w+: 읽기/쓰기 위해 open. 없으면 생성, 존재하면 삭제 후 다시 생성.
a+ : 읽기/추가하기 위해 open. 없으면 생성, 존재하면 추가.

택1, 생략시 t 모드
b : 기계어 상태로 open
t : 텍스트 상태로 open

No comments:

Post a Comment