easy software

C언어 파일개방모드(파일접근모드+데이터입/출력모드)를 알아보자 본문

C언어/FILE IO

C언어 파일개방모드(파일접근모드+데이터입/출력모드)를 알아보자

JAVA 웹개발자 2015. 2. 12. 15:34

파일 접근 모드란?

 

 

파일 접근 모드는 r, w, a, r+, w+, a+가 있습니다.

 

대부분은 r, w, a를 사용하며, 각각의 기능은 아래와 같습니다.

 

- r 은 파일을 읽을때 사용

 

- w는 파일을 쓰기위해 사용(파일이 존재하면 기존파일 삭제후 씀. 파일이 없으면 생성)

 

- a는 파일이 존재하면 데이터를 지우지 않고 파일의 끝에서부터 데이터를 추가(나머지는 w와 동일)

 

+가 붙는 접근 모드들은 모두 읽기/쓰기가 가능합니다. 여기에 문제가 조금 있습니다.

 

r로 접근하면 스트림은 읽기 전용 모드로 생성되면서 버퍼또한 읽는 용도로만 사용하면 됩니다.

 

w와 a도 마찬가지의 맥락입니다.

 

그런데 +가 붙으면 버퍼에서 읽기/쓰기를 모두 관여하게 되므로 문제가 발생할 수 있습니다.

 

되도록이면 +가 붙지 않는 접근 모드를 사용하시기 바랍니다.

 

 

 

 

데이터 입/출력 모드란?

 

 

텍스트 모드를 의미하는 t 와, 2진 모드를 의미하는 b 가 있습니다.

 

이 둘의 차이점은 CR과 LF를 이해 한 후 설명드리겠습니다.

 

CR(Carriage Return)은 특수문자 \r입니다.

 

printf("123345 \r");

printf("qwertyt");

 

를 호출해보시면 두번째 호출한 문자열이 출력됩니다.

 

\r은 커서를 맨 앞으로 옮기는 용도로 사용되는 특수문자입니다.

 

그러므로 처음 호출했던 printf가 먼저 출력되지만, 커서가 다시 맨 앞으로 이동하여

 

두번째 printf함수가 덮어쓰게 되는 것입니다.

 

 

LF(Line Feed)는 특수문자 \n입니다.

 

줄바꿀때 많이 사용했던 그 친구입니다.

 

다만 줄만 바꾸라는 의미이지, 커서의 위치까지 맨 앞으로 이동하라는 것은 아닙니다.

 

printf("123345 \n");

printf("qwertyt");

 

그런데 위의 코드를 실행해보면 두개의 호출문이 가지런하게 출력됩니다.

 

분명히 줄만 바꿔야되면

 

123345

qweryt

 

로 출력되어야 하지 않나요?

 

여러분들이 보고계시는 화면은 \r\n이 모두 사용된 것처럼 출력되었습니다. 이유는?

 

C프로그램 상에서는 \n으로 사용을 했지만, 텍스트 파일상에서는 자동으로 \r\n으로 변환이됩니다.

 

그리고 텍스트파일상에서 \r\n으로 되어있는 친구는 C프로그램상으로 오면 \n으로 변환이됩니다.

 

이렇듯 변환이 필요한 문자열과 같은 텍스트 기반의 데이터는 텍스트 모드로 입/출력하는 것이 좋고,

 

데이터 변환이 발생하면 안되는 경우(영상, mp3등)는 2진 모드로 데이터를 입출력하는게 좋습니다.

 

* 텍스트 형식의 데이터라도 b를 사용하여 2진 데이터처럼 입/출력을 할 수도 있습니다.

 

  이유는 텍스트도 메모리상에서는 0과 1로 이루어져 있기 때문입니다. 권장하지는 않습니다.

 

 

 

파일 개방 모드란?

 

 

결론은 파일 접근 모드 + 데이터 입/출력 모드 입니다.

 

fopen함수를 호출하면서 두번째 인자로 파일 개방 모드를 전달하는데.

 

이때 위의 수식처럼 결합을 해준녀석을 문자열 형식으로 전달하면 됩니다.

 

Test.txt를 텍스트 모드 기반의 읽기 전용으로 개방하려고 한다면,

 

FILE* fp = fopen("Test.txt", "rt");

 

처럼 사용하시면 됩니다.

 

바이너리 모드 기반의 쓰기를 원한다면 "rt" 대신의 "wb"로 전달하면 됩니다.

Comments