fopen의 파일 열기 옵션은 좀처럼 제대로 외우기가 쉽지 않다. 또한 모든 옵션별 차이점을 제대로 파악하기도 쉽지 않고... 일단 파악된 만큼 정리해 놓고... 추후 더 발견된 사항이 있으면 지속적으로 update해 나가는게 좋을 듯..
"r" : 읽기 전용 모드. 파일이 없으면 NULL return.
"w" :쓰기 전용 모드. 파일이 없으면 생성되고 있으면 내용이 없어진다.
"a" : append모드. 파일이 없으면 생성. 이미 존재하는 파일 끝부분에 file pointer가 위치하게 되며 이 위치부터 뒷쪽으로만 write가능. 읽기는 불가능. fseek등으로 이 부분보다 앞으로 file pointer를 이동시키면 어떻게 될까 ? 아래 내용으로 봐서는 fseek등으로 file pointer를 이동하여도 이와 상관없이 파일 끝부분에 write가 되는 것으로 생각됨.
Opening a file in append mode (a in the mode) causes all subsequent writes to the file to be forced to the current end-of-file, regardless of previous calls to the fseek() function.
"r+" : 읽고 쓰기 모드, 파일이 없으면 NULL return.
"w+" : 읽고 쓰기 모드 단, 파일이 없으면 만들고 있으면 기존 내용을 지움. write를 먼저 한 후 동일 파일 포인터로 읽기 수행이 필요한 경우 사용. 보통은 읽기 전용, 혹은 쓰기 전용으로 fopen하므로 w+가 필요한 일은 별로 없을 듯.
"a+" : append모드, 읽고 쓰기 가능. 파일이 이미 존재할 경우 그 파일의 끝부분에서부터 추가된 내용을 쓴다. 읽기는 fseek로 지정한 file pointer위치에서 가능하나 쓰기는 파일 끝부분에서만 가능.
When a file is opened with update mode (+ in the mode), both input and output may be performed on the associated stream
[출처] http://dooeui.blogspot.com/2008/10/fopen.html
그리고 rb, rt 처럼 뒤에 b와 t는 :
b : binary
t : text 를 뜻 합니다.
b, t의 다른 점은 b로 파일을 쓸 경우 text에디터로 열면 알 수 없는 문자료 표기된다고 보시면 되고, t는 일반 text파일로 써 사람이 저장된 데이터를 읽을 수 있는 그대로 볼 수 있습니다.
물론 b로 파일을 저장했다면, 반드시 b모드로 파일을 읽어야만 합니다. text mode일 경우도 동일하고요.
즉, 각 설명은 아래와 같이 볼 수 있습니다.
a) "r"와 "rb"
- r : 오직 파일을 읽기 위해서 개방(해당 파일을 열기만 할 때)
- rb : 파일을 읽기 위해서 개방 그리고 2진모드(binary mode)로 하라
b) "rb" 와 "r+b"
- rb : 파일을 읽기 위해서 개방하는데 2진모드(binary mode)로 하라.
- r+b : 파일을 읽고 쓰기위해서 개방하는데 2진모드로 하라.
c) "w"와 "wb"
- w : 파일을 쓰기위해 개방(오직 쓰기)
- wb: 파일을 쓰기위해 개방하고 binary mode로 개방하라.
d)"ab"와 "a+b"
ab : w모드와 달리,지정해 준 파일이 존재하면 data를 지우지 않고 파일의 끝에서 부터 추가하고 binary mode로 한다.
a+b : 파일을 읽고 쓰기위해 개방하는데 지정해 준 파일이 존재 시 파일 끝에서 부터 데이터를 추가하며 binary mode로 한다.
출처 : 네이버지식인
"r" : 읽기 전용 모드. 파일이 없으면 NULL return.
"w" :쓰기 전용 모드. 파일이 없으면 생성되고 있으면 내용이 없어진다.
"a" : append모드. 파일이 없으면 생성. 이미 존재하는 파일 끝부분에 file pointer가 위치하게 되며 이 위치부터 뒷쪽으로만 write가능. 읽기는 불가능. fseek등으로 이 부분보다 앞으로 file pointer를 이동시키면 어떻게 될까 ? 아래 내용으로 봐서는 fseek등으로 file pointer를 이동하여도 이와 상관없이 파일 끝부분에 write가 되는 것으로 생각됨.
Opening a file in append mode (a in the mode) causes all subsequent writes to the file to be forced to the current end-of-file, regardless of previous calls to the fseek() function.
"r+" : 읽고 쓰기 모드, 파일이 없으면 NULL return.
"w+" : 읽고 쓰기 모드 단, 파일이 없으면 만들고 있으면 기존 내용을 지움. write를 먼저 한 후 동일 파일 포인터로 읽기 수행이 필요한 경우 사용. 보통은 읽기 전용, 혹은 쓰기 전용으로 fopen하므로 w+가 필요한 일은 별로 없을 듯.
"a+" : append모드, 읽고 쓰기 가능. 파일이 이미 존재할 경우 그 파일의 끝부분에서부터 추가된 내용을 쓴다. 읽기는 fseek로 지정한 file pointer위치에서 가능하나 쓰기는 파일 끝부분에서만 가능.
When a file is opened with update mode (+ in the mode), both input and output may be performed on the associated stream
[출처] http://dooeui.blogspot.com/2008/10/fopen.html
그리고 rb, rt 처럼 뒤에 b와 t는 :
b : binary
t : text 를 뜻 합니다.
b, t의 다른 점은 b로 파일을 쓸 경우 text에디터로 열면 알 수 없는 문자료 표기된다고 보시면 되고, t는 일반 text파일로 써 사람이 저장된 데이터를 읽을 수 있는 그대로 볼 수 있습니다.
물론 b로 파일을 저장했다면, 반드시 b모드로 파일을 읽어야만 합니다. text mode일 경우도 동일하고요.
즉, 각 설명은 아래와 같이 볼 수 있습니다.
a) "r"와 "rb"
- r : 오직 파일을 읽기 위해서 개방(해당 파일을 열기만 할 때)
- rb : 파일을 읽기 위해서 개방 그리고 2진모드(binary mode)로 하라
b) "rb" 와 "r+b"
- rb : 파일을 읽기 위해서 개방하는데 2진모드(binary mode)로 하라.
- r+b : 파일을 읽고 쓰기위해서 개방하는데 2진모드로 하라.
c) "w"와 "wb"
- w : 파일을 쓰기위해 개방(오직 쓰기)
- wb: 파일을 쓰기위해 개방하고 binary mode로 개방하라.
d)"ab"와 "a+b"
ab : w모드와 달리,지정해 준 파일이 존재하면 data를 지우지 않고 파일의 끝에서 부터 추가하고 binary mode로 한다.
a+b : 파일을 읽고 쓰기위해 개방하는데 지정해 준 파일이 존재 시 파일 끝에서 부터 데이터를 추가하며 binary mode로 한다.
출처 : 네이버지식인
[출처] fopen의 옵션들|작성자 남땡
바이너리(Binary) & 텍스트(Text) 파일의 차이
2010/04/23 11:32
'바이너리와 텍스트의 차이'를 검색하다 여기까지 찾아오셨다면 잘오셨습니다. 혹시 좀전에
"텍스트(text) 파일은 문자를 출력하는데 적합한... 어쩌고 저쩌고
...반면 바이너리(binary)는 그림이나 음악 파일을 저장하는데 적합합니다..."
이런 자료를 보셨다면 빨리 잊으십시오 =_=;;
적어도 개발자라면, 이런 컴퓨터 교양 서적 서두에나 적힐 법한 자료를 원하진 않을것입니다.
C언어든 아니든간에, 파일을 저장할 때 text mode와 binary mode를 구분하게 되어있습니다.
Windows OS 위에서의 애기지만요~ 어쨌든,
간단한 테스트를 위해 아래와 같이 문자열을 만들고 text mode와 binary mode로 저장해봅시다.
예) "안녕하세요? 어쩌구 저쩌구~..."
다음 메모장으로 읽어보죠.
둘 다 똑같죠?
아~ 똑같구나~ 해서 그냥 사용하면, 반드시 가까운 미래에 알 수 없는 버그와 함께 돌아옵니다.
좀 차이를 두기 위해 아래와 같이 코딩하고 파일을 비교해 봅시다.
void CMFCViewerDlg::OnBnClickedButton2()
{
int data[100];
for(int i=0; i<100; i++)
data[i] = i;
SaveFile("binary.log", (char*)data, sizeof(data), 1); // binary mode로 저장
SaveFile("text.log", (char*)data, sizeof(data), 0); // text mode로 저장
}


"똑같은 내용인데, 크기가 1바이트 다릅니다."
이것은 binary mode의 특정 캐릭터(charactor)가 text mode로 저장될 때 2byte로 저장되기 때문입니다. 바로 줄바꿈 캐릭터입니다. CR & LF 라 불리는 것들인데, UNIX, MAX, Windows 3인방에서 각각 줄바꿈을 다르게 사용하다보니 생긴 현상입니다.
어쨌든 text mode는 줄바꿈을 CRLF로 관리하는데, 여기서 CR은 0x0D 이고 LF는 0x0A 입니다.
그래서 위의 예제에서
"text mode로 저장하면 정수(integer) 0x10 이 LF로 인식되어 0x0A0D 로 변형저장 됩니다."
그래서 무턱대고 구조체나 배열 데이터를 text mode로 저장했다가 읽으면 알 수 없는 0x0D가 어디선가 튀어나오게 됩니다.
결론: 데이터를 저장할 때는 반드시 binary mode로 저장하는 습관을 가지세요 -*
"텍스트(text) 파일은 문자를 출력하는데 적합한... 어쩌고 저쩌고
...반면 바이너리(binary)는 그림이나 음악 파일을 저장하는데 적합합니다..."
이런 자료를 보셨다면 빨리 잊으십시오 =_=;;
적어도 개발자라면, 이런 컴퓨터 교양 서적 서두에나 적힐 법한 자료를 원하진 않을것입니다.
C언어든 아니든간에, 파일을 저장할 때 text mode와 binary mode를 구분하게 되어있습니다.
Windows OS 위에서의 애기지만요~ 어쨌든,
간단한 테스트를 위해 아래와 같이 문자열을 만들고 text mode와 binary mode로 저장해봅시다.
예) "안녕하세요? 어쩌구 저쩌구~..."
다음 메모장으로 읽어보죠.
둘 다 똑같죠?
아~ 똑같구나~ 해서 그냥 사용하면, 반드시 가까운 미래에 알 수 없는 버그와 함께 돌아옵니다.
좀 차이를 두기 위해 아래와 같이 코딩하고 파일을 비교해 봅시다.
void CMFCViewerDlg::OnBnClickedButton2()
{
int data[100];
for(int i=0; i<100; i++)
data[i] = i;
SaveFile("binary.log", (char*)data, sizeof(data), 1); // binary mode로 저장
SaveFile("text.log", (char*)data, sizeof(data), 0); // text mode로 저장
}
"똑같은 내용인데, 크기가 1바이트 다릅니다."
이것은 binary mode의 특정 캐릭터(charactor)가 text mode로 저장될 때 2byte로 저장되기 때문입니다. 바로 줄바꿈 캐릭터입니다. CR & LF 라 불리는 것들인데, UNIX, MAX, Windows 3인방에서 각각 줄바꿈을 다르게 사용하다보니 생긴 현상입니다.
어쨌든 text mode는 줄바꿈을 CRLF로 관리하는데, 여기서 CR은 0x0D 이고 LF는 0x0A 입니다.
그래서 위의 예제에서
"text mode로 저장하면 정수(integer) 0x10 이 LF로 인식되어 0x0A0D 로 변형저장 됩니다."
그래서 무턱대고 구조체나 배열 데이터를 text mode로 저장했다가 읽으면 알 수 없는 0x0D가 어디선가 튀어나오게 됩니다.
결론: 데이터를 저장할 때는 반드시 binary mode로 저장하는 습관을 가지세요 -*
출처:http://snbosoft.tistory.com/76
네이버 지식인의 binary mode에 대한 글은 잘못 된 부분이 있네요....
답글삭제작성자가 댓글을 삭제했습니다.
답글삭제