바이너리 모드와 텍스트 모드로 작성된 파일의 차이
바이너리 모드로 열리지 않는 텍스트모드로 열린 파일에 쓸 경우 어떤 변환이 이루어집니까?특히 MS Visual C에서 그렇습니다.
unsigned char buffer[256];
for (int i = 0; i < 256; i++) buffer[i]=i;
int size = 1;
int count = 256;
이진 모드:
FILE *fp_binary = fopen(filename, "wb");
fwrite(buffer, size, count, fp_binary);
텍스트 모드와 비교:
FILE *fp_text = fopen(filename, "wt");
fwrite(buffer, size, count, fp_text);
대부분의 플랫폼은 스트림을 처리할 때 "t" 옵션이나 "text-mode" 옵션을 무시한다고 생각합니다.그러나 윈도우에서는 그렇지 않습니다.MSDN에서 fopen() 함수에 대한 설명을 보면 "t" 옵션을 지정하면 다음과 같은 효과가 있음을 알 수 있습니다.
- 라인 피드('\n')는 출력 시 '\r\n' 시퀀스로 변환됩니다.
- 캐리지 리턴/라인 피드 시퀀스는 입력 시 라인 피드로 변환됩니다.
- 파일이 append 모드로 열려 있는 경우 파일의 끝에 ctrl+z 문자(문자 26)가 있는지 여부를 검사하고 가능하면 해당 문자를 삭제합니다.또한 해당 문자의 존재는 파일의 끝으로 해석됩니다.이것은 CPM(부모의 죄에 관한 것) 시절부터 3, 4대까지의 불운한 유보이다.앞서 말한 의견과 달리 ctrl-z 문자는 추가되지 않습니다.
이 질문은 이미 답변이 끝난 상태이지만, 간단한 코드 예시로 주요 이슈(\n과\r\n의 변환)를 보여주는 것이 흥미롭다고 생각합니다.파일 끝에 있는 Ctrl-Z 문자에 대한 문제는 다루지 않습니다.
#include <stdio.h>
#include <string.h>
int main() {
FILE *f;
char string[] = "A\nB";
int len;
len = strlen(string);
printf("As you'd expect string has %d characters... ", len); /* prints 3*/
f = fopen("test.txt", "w"); /* Text mode */
fwrite(string, 1, len, f); /* On windows "A\r\nB" is writen */
printf ("but %ld bytes were writen to file", ftell(f)); /* prints 4 on Windows, 3 on Linux*/
fclose(f);
return 0;
}
Windows 로 프로그램을 실행하면, 다음의 메세지가 표시됩니다.
As you'd expect string has 3 characters... but 4 bytes were writen to file
물론 Notepad++와 같은 텍스트 편집기로 파일을 열고 다음과 같은 문자를 볼 수도 있습니다.
텍스트 모드에서 파일을 읽을 때 Windows에서 역변환이 수행됩니다.
텍스트 모드에서는 새 줄 "\n"을 캐리지 리턴 + 새 줄 "\r\n"로 변환할 수 있습니다.
보통 바이너리 모드로 엽니다.텍스트 모드에서 바이너리 데이터를 읽으려고 해도 작동하지 않고 손상됩니다.바이너리 모드에서는 텍스트를 정상적으로 읽을 수 있습니다.단, "\n"에서 "\r\n"으로의 자동 변환은 이루어지지 않습니다.
「fopen」을 참조
또 다른 차이점은 사용했을 때 입니다.fseek
스트림이 바이너리 모드로 열려 있는 경우, 새로운 위치는 원본이 SEEK_SET인 경우 파일의 시작부터 현재 파일 위치로부터 SEEK_CUR인 경우, 그리고 원본이 SEEK_END인 경우 파일의 끝부터 정확하게 측정된 오프셋 바이트입니다.일부 바이너리 스트림은 SEEK_END를 지원하지 않을 수 있습니다.
스트림이 텍스트모드로 오픈되어 있는 경우 지원되는 오프셋 값은 제로(임의의 발신기지에서 동작)와 같은 파일(SEEK_SET의 발신기지에서만 동작)에 관련된 스트림의 std::ftell에 대한 이전 호출에 의해 반환된 값뿐입니다.
또한 "rt"가 있는 파일을 열면 입력이 Crtl-Z 문자로 종료됩니다.
텍스트 모드에서 파일을 열 때 흥미로운 문제가 발생했습니다. 파일 끝에는 다음과 같은 문자가 혼재되어 있습니다.
1\n\r
2\n\r
3\n
4\n\r
5\n\r
현재 위치를 파일에 저장하고(fgetpos를 사용), 파일을 닫은 후 파일을 다시 열고 해당 위치를 찾을 수 있어야 합니다(fsetpos를 사용).
그러나 파일에 행 끝의 혼합물이 있는 경우 이 프로세스는 실제 동일한 위치를 찾지 못했습니다.이 경우(C++를 해석한 툴)에서는 이미 본 파일의 일부를 다시 읽고 있었습니다.
이진법 사용 - 파일에서 읽고 쓰는 내용을 정확하게 제어할 수 있습니다.
'w' 모드에서는 파일이 쓰기 모드로 열리고 'wb' 모드에서는 기본 코딩이 'utf-8' 이며, 파일은 쓰기 바이너리 모드로 열리며 다른 특수 문자를 쓸 수 있으며, 인코딩은 'utf-16le' 또는 기타일 수 있습니다.
언급URL : https://stackoverflow.com/questions/229924/difference-between-files-written-in-binary-and-text-mode
'IT이야기' 카테고리의 다른 글
쉼표 연산자의 적절한 사용법은 무엇입니까? (0) | 2022.06.10 |
---|---|
VueJ 2.0 - 소품 업데이트 시 컴포넌트를 잠글 수 없음 (0) | 2022.06.10 |
stacktrace를 log4j로 전송하는 방법 (0) | 2022.06.10 |
Vue 구성 요소의 mounted()에 있는 상태 개체에 액세스하려고 합니다. (0) | 2022.06.10 |
Java에서 싱글톤 패턴을 구현하는 효율적인 방법은 무엇입니까? (0) | 2022.06.10 |