programing

바이너리 및 텍스트 모드로 작성된 파일의 차이점

projobs 2021. 1. 15. 07:32
반응형

바이너리 및 텍스트 모드로 작성된 파일의 차이점


바이너리 모드에서 발생하지 않는 텍스트 모드로 열린 파일에 쓸 때 어떤 변환이 발생합니까? 특히 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"옵션 또는 "텍스트 모드"옵션을 무시할 것이라고 생각합니다. 그러나 Windows에서는 그렇지 않습니다. MSDN 에서 fopen () 함수에 대한 설명을 살펴보면 "t"옵션을 지정하면 다음과 같은 효과가 있음을 알 수 있습니다.

  • 줄 바꿈 ( '\ n')은 출력시 '\ r \ n "시퀀스로 변환됩니다.
  • 캐리지 리턴 / 줄 바꿈 시퀀스는 입력시 줄 바꿈으로 변환됩니다.
  • 파일이 추가 모드에서 열리면 파일 끝에서 ctrl-z 문자 (26 번 문자)를 검사하고 가능하면 해당 문자를 제거합니다. 또한 해당 문자의 존재를 파일의 끝으로 해석합니다. 이것은 CPM (3 세대 또는 4 세대까지 자녀들에게 방문한 부모의 죄에 관한 것) 시대로부터의 불행한 유예입니다. 이전에 언급 한 의견과 달리 ctrl-z 문자는 추가되지 않습니다.

텍스트 모드에서 개행 "\ n"은 캐리지 리턴 + 개행 "\ r \ n"으로 변환 될 수 있습니다.

일반적으로 바이너리 모드로 열어야합니다. 텍스트 모드에서 바이너리 데이터를 읽으려고하면 작동하지 않고 손상됩니다. 바이너리 모드에서도 텍스트를 읽을 수 있습니다. "\ n"을 "\ r \ n"으로 자동 번역하지 않습니다.

fopen 참조


또한 "rt"로 파일을 열면 Crtl-Z 문자로 입력이 종료됩니다.


또 다른 차이점은 fseek

스트림이 바이너리 모드로 열려있는 경우 새 위치는 origin이 SEEK_SET 인 경우 파일의 시작 부분부터, origin이 SEEK_CUR 인 경우 현재 파일 위치에서, origin이 SEEK_END 인 경우 파일의 끝에서 측정 된 정확히 오프셋 바이트입니다. 일부 바이너리 스트림은 SEEK_END를 지원하지 않을 수 있습니다.

스트림이 텍스트 모드로 열려있는 경우 오프셋에 대해 지원되는 유일한 값은 0 (모든 출처에서 작동)과 동일한 파일과 연관된 스트림에서 std :: ftell에 대한 이전 호출에서 반환 된 값입니다 ( SEEK_SET의 출처.


파일에 줄 끝 문자가 혼합 된 텍스트 모드에서 파일을 여는 데 흥미로운 문제가있었습니다.

1\n\r
2\n\r
3\n
4\n\r
5\n\r

우리의 요구 사항은 파일에 현재 위치를 저장하고 (fgetpos 사용) 파일을 닫은 다음 나중에 파일을 다시 열고 해당 위치를 찾을 수 있어야합니다 (fsetpos 사용).

그러나 파일에 줄 끝이 혼합되어있는 경우이 프로세스는 실제 동일한 위치를 찾지 못했습니다. 우리의 경우 (우리의 도구는 C ++를 구문 분석) 이미 본 파일의 일부를 다시 읽었습니다.

바이너리를 사용하면 파일에서 읽고 쓰는 것을 정확하게 제어 할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/229924/difference-between-files-written-in-binary-and-text-mode

반응형