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를 사용할 때도 마찬가지로 주의를 해야 한다.

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

Trackback | http://blog.sragent.pe.kr/trackback/41 관련글 쓰기

댓글을 달아 주세요

  1. 배재현 2009/12/30 10:02  Addr Edit/Del Reply

    고생하셨군요 ㅋㅋ

  2. 우욱 2010/04/12 07:13  Addr Edit/Del Reply

    AS812에서 같이 놀던(?) 놈임돠

    구글링하다가 형 블로그가 구글 최상단에 떠버리는 사태가.. ㅋㅋ

    얼굴 못 뵌지 넘 오래~~

    잘 지내시나봐요. *^_^*

    다시 코딩하러 후다닥~

    • 심보준 2010/04/16 13:27  Addr Edit/Del

      종민인가? 반갑다^^ 흔적만 남기고 가버리면 어떡하나. 꼬리라도 남겨야지.

prev 1 2 3 4 5 6 7 8 9 ... 36 next