2009/12/30 00:15
else if (개발)
리눅스에서 윈도우로 옮겼더니 돌지 않는 코드를 보고 알게 된 것이다.
아래와 같은 코드가 있다.
#include <stdio.h>
int main() {
//1바이트 짜리 변수
char c;
FILE *fp;
// 하필. 이런 값을 한번 넣어본다.
c = 0x0a;
fp = fopen("test.bin", "w");
// 1 바이트를 쓴다.
fwrite(&c, 1, sizeof(char), fp);
fclose(fp);
return 0;
}
위 코드를 windows에서 컴파일하고 실행하면 생성되는 test.bin 파일의 크기는?
놀랍게도 2바이트 짜리 파일이 생긴다. 왜그럴까...
해결은 fopen을 다음과 같이 수정하면 된다.
fp = fopen("test.bin", "wb");
즉, 원래 코드는 ascii 모드로 open 한 거고, 수정된 코드는 binary 모드로 open 한 것이다. ascii 모드로 열고 위 코드를 실행하면 0x0a 뒤에 0x0d 즉, carriage return이 붙고, 파일 크기가 2 byte가 된다. 이건 windows에서만 그런 거다. 파일을 읽기 위해 open 하고, fread를 사용할 때도 마찬가지로 주의를 해야 한다.
위 코드는 설명을 위해 간단히 만든 시나리오고, 실제로는 몇 메가짜리 바이너리 파일을 쓰는 코드였는데, 알고 나니 재밌지만 과정은 기억에 오래 남을 삽질이었다.


댓글을 달아 주세요
고생하셨군요 ㅋㅋ
나름 재밌었어^^
AS812에서 같이 놀던(?) 놈임돠
구글링하다가 형 블로그가 구글 최상단에 떠버리는 사태가.. ㅋㅋ
얼굴 못 뵌지 넘 오래~~
잘 지내시나봐요. *^_^*
다시 코딩하러 후다닥~
종민인가? 반갑다^^ 흔적만 남기고 가버리면 어떡하나. 꼬리라도 남겨야지.