지금껏 Unix, linux용 프로그램만 작성하다가 회사를 옮긴 후 windows 프로그램을 하고 있다.
나에게 필요한 라이브러리들을 만들어서 사용하다가 이 곳에서도 그 프로그램을 이용하게 되었는데, 문제가 발생했다.
분명 나는 80byte만 쓰라고 fwrite()로 사이즈를 지정 했음에도 불구하고, windows에서는 81byte가 들어가 있었다.
이 문제를 찾느라 하루를 허비해버렸는데...
8byte를 10번 루프를 돌면서 작성을 하기 때문에 당연히 결과는 80byte만 작성이 되어야 함에도 불구하고, windows에서는 81byte가 엄연히 작성되어 있다.
그 이유는...
파일 종류 중에서 일반 바이너리 모드와 텍스트 모드와의 차이점은 개행문자('\n', Line Feed, LF)의 처리 방식 때문이였다.
그런 이유로 위 프로그램을 수행 후 생성된 파일을 Hex Code로 마지막을 보게 되면 0x0D, 0x0A 로 어처구니 1byte가 더 사용하게 되어 있음을 보게 되었다.
웃기는 건 fwrite() 함수 자체가 바이너리로 작성하게 되어 있는데, 그렇게 안 되니 참...
windows 시스템이 웃기는건지, 아님 그런 상황을 이해 못하는 내가 웃기는건지..
어쨌든, 해결 방법은 간단하다.
fopen 시 텍스트 모드가 아니라, 바이너리 모드로 옵션을 조정해줘야 한다.
나에게 필요한 라이브러리들을 만들어서 사용하다가 이 곳에서도 그 프로그램을 이용하게 되었는데, 문제가 발생했다.
분명 나는 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);
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 |