else if (개발)2009/12/30 00:15
리눅스에서 윈도우로 옮겼더니 돌지 않는 코드를 보고 알게 된 것이다.

아래와 같은 코드가 있다.
#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를 사용할 때도 마찬가지로 주의를 해야 한다.

위 코드는 설명을 위해 간단히 만든 시나리오고, 실제로는 몇 메가짜리 바이너리 파일을 쓰는 코드였는데, 알고 나니 재밌지만 과정은 기억에 오래 남을 삽질이었다.
Posted by 심보준