삽질의 현장/- C

곱씹어보자 C!_#029_삽잡이의 두서없이 막말하는 파일 입출력 (3)

shovelman 2015. 7. 1. 01:00


안녕하세요 삽잡이입니다~


1
2
3
4
5
6
7
8
9
10
 
void main()
{
    FILE* fp = NULL;
    char c = '\n';
 
    printf("%c %d \n", c, c);
}
 
 
cs


char 변수에 New Line 즉 '\n' 을 저장하고

각각 %c, %d 값으로 출력하는 코드입니다.

결과적으로 %c 일경우 \n의 역할을, 

%d일 경우 10이 출력되는 것을 확인할 수 있습니다.


OS 마다 화면, 파일상 다루는 동작들이 다르기 때문에 주의해야할 상항들이 있습니다.


아무튼...

즉, \n의 아스키 코드 값은 10이라는 것입니다. 


지금부터 간단하게 용어를 설명하고 시작하겠습니다...

한줄 내리는 것을 New Line이라고 부릅니다.

그리고 앞줄로 당기는 것을 Carriage Return 이라고 부르죠...


두 용어가 다른데 말입니다, 두가지를 + 한 문자가 바로 \n입니다.

아쉽게도 파일에서는 이를 구분합니다.

즉, New Line(\n)과 Carriage Return(\r) 두 가지를 붙여야지 

콘솔창과 같은 역할을 하게 된다는 것입니다.


흠.. 헷갈리시죠?

콘솔창에 출력하고자 할 때 우리는 \n 하나로 동작했었는데요,

파일에는 \r\n이 합쳐져야 된다는 것입니다.

다시 말해, \r(ASCII 13번) \n(10번) 이 붙어야한 다는 것입니다.

OS마다 다르지만 Window에서는 이렇습니다...


Window OS에서는 

파일에 출력할 때에는 자동으로 \n이 \r\n으로 바뀝니다.

또한 다시 읽어들일때에는 \n으로 변경되어진다는 것입니다.


메모리상 출력될 때에는 \r\n, 읽어들일때에는 \n이 되어야 합니다.

여기서 문제가 생깁니다...

아스키 코드가 2 byte로 출력되고 읽어들일때에는 1바이트가 된다는 것입니다...


음... 뭔말이냐 하면...

메모리 상에서 \n은 콘솔과 파일에서 각각 \n, \r\n 이라는 차이가 있습니다.


t(text mode)일 때에는 변환 작업을 자동으로 해주기에 편리하지만,

Binary 모드 일 때에는 자동으로 작업을 하면 안되게 되는것입니다...

따라서 바이너리 모드일 대에는 자동으로 작업되면 안됩니다.

바이너리 코드는 0과 1의 집합이라고 했는데... 

내가 쓰고자하는 바이트 수가 바이너리에서는 정확하게 읽혀지는데

\n, \r\n 이라는 자동 변환에 의해서 

메모리 가 변경될 수도 있다 이겁니다!


그렇다면 여기서 궁금증이 풀립니다...


Text 로 출력할 때에는 

fopen() 에서 'w', 'r', 'wt', 'rt' 와 같이 써도 상관없지만,

binary mode에서는 자동변환이 되어서는 안되기 때문에 

'rb', 'wb' 이와 같이만 써야되는 것입니다.


메모리가 늘어나거나 줄어들면 큰일 나기 때문입니다!