바이너리 및 텍스트 모드로 작성된 파일의 차이점
바이너리 모드에서 발생하지 않는 텍스트 모드로 열린 파일에 쓸 때 어떤 변환이 발생합니까? 특히 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
'programing' 카테고리의 다른 글
signalR의 재 연결은 언제 발생합니까? (0) | 2021.01.15 |
---|---|
팬더는 그룹 집계 및 열별로 정렬 (0) | 2021.01.15 |
pdflatex를 조용히 실행 (0) | 2021.01.15 |
현재 WCF 호출에 대한 데이터를 어디에 저장할까요? (0) | 2021.01.15 |
stringstream 복사가 허용되지 않는 이유는 무엇입니까? (0) | 2021.01.15 |