지금껏 Unix, linux용 프로그램만 작성하다가 회사를 옮긴 후 windows 프로그램을 하고 있다.
나에게 필요한 라이브러리들을 만들어서 사용하다가 이 곳에서도 그 프로그램을 이용하게 되었는데, 문제가 발생했다.

분명 나는 80byte만 쓰라고 fwrite()로 사이즈를 지정 했음에도 불구하고, windows에서는 81byte가 들어가 있었다.
이 문제를 찾느라 하루를 허비해버렸는데...

FILE *pFP;
int i, j;


pFP = fopen("test.txt", "w");

for( i = 1, j = 0;  i < 11;  i++, j++) {
    fwrite(&j, sizeof(int), 1, pFP);    // 0~9까지의 숫자를 쓰기
    fwrite(&i, sizeof(int), 1, pFP);    // 1~10까지의 숫자를 쓰기
}

fclose(pFP);

8byte를 10번 루프를 돌면서 작성을 하기 때문에 당연히 결과는 80byte만 작성이 되어야 함에도 불구하고, windows에서는 81byte가 엄연히 작성되어 있다.

그 이유는...
파일 종류 중에서 일반 바이너리 모드와 텍스트 모드와의 차이점은 개행문자('\n', Line Feed, LF)의 처리 방식 때문이였다.

Unix, Linux 등에서 개행문자 '\n'은 아스키코드10(0x0A)으로서 1문자 길이가 되지만, MS-DOS나 Windows 계통의 OS, 혹은 프린터라든지 기타 통신에 사용되는 텍스트에서의 개행은 CR(Carriage Return, 0x0D, '\r', 행리턴)과 LF를 연결해서 사용하므로 2byte가 된다.

그런 이유로 위 프로그램을 수행 후 생성된 파일을 Hex Code로 마지막을 보게 되면 0x0D, 0x0A 로 어처구니 1byte가 더 사용하게 되어 있음을 보게 되었다.
웃기는 건 fwrite() 함수 자체가 바이너리로 작성하게 되어 있는데, 그렇게 안 되니 참...
windows 시스템이 웃기는건지, 아님 그런 상황을 이해 못하는 내가 웃기는건지..

어쨌든, 해결 방법은 간단하다.
fopen 시 텍스트 모드가 아니라, 바이너리 모드로 옵션을 조정해줘야 한다.

pFP = fopen("test.txt", "wb");


'IT > 일반' 카테고리의 다른 글

Naming Rule for C/C++  (2) 2008.02.27
struct의 size 값은??  (0) 2008.02.22
블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,