바이너리 플래그가 설정된 fstream을 사용하고 형식이 지정되지 않은 I/O 함수를 사용하여 읽고 쓰는 이진 파일을 조작하는 코드가 있습니다. 이것은 이전에 사용했던 모든 시스템에서 올바르게 작동하지만 (파일의 비트가 예상대로 정확하게 나타남) 기본적으로 모두 미국 영어입니다. 나는 다른 시스템에서 코덱으로 수정 될 가능성에 대해 궁금해했다.C++을 사용하여 이진 파일 작성 : 기본 로케일이 중요합니까?
표준 형식처럼 입/출력을 사용하면 sputc/sgetc를 사용하여 streambuf에 문자를 넣는 것과 동일하게 작동합니다. 이것들은 streambuf에서 오버플로 또는 언더 플로 기능으로 이어지며, 일부 코덱을 통과하는 것으로 보입니다 (예 : C++ 표준의 27.8.1.4.3 참조). basic_filebuf의 경우이 codecvt의 생성은 27.8.1.1.5에 명시되어있다. 결과는 basic_filebuf.getloc()이 반환하는 것에 따라 달라질 것입니다.
내 질문에, 한 시스템에서 ofstream.write를 사용하여 작성된 문자 배열은 다른 시스템에서 ifstream.read를 사용하여 그대로 사용할 수 있다고 가정 할 수 있습니다. 체계? 나는 다음과 같은 가정을 만들 것입니다 :이 프로그램은 (로케일 설정 자체 전혀 변화 즉, 프로그램이 아니다 ) 기본 로케일을 사용
- .
- 시스템은 모두 CHAR_BIT 8을 가지며 각 바이트 내에서 동일한 비트 순서를 가지며 파일을 옥텟 등으로 저장합니다.
- 스트림 객체에는 2 진 플래그 세트가 있습니다.
- 이 단계에서 endianess 차이점에 대해 걱정할 필요가 없습니다. 배열의 임의의 바이트를 멀티 바이트 값으로 해석해야하는 경우 엔디안 변환은 필요에 따라 나중에 처리됩니다. 기본 로케일은 일부 시스템 구성에 대한 수정되지 않은이 재료를 통과 보장되지 않으면
(나는, 아랍어 또는 뭔가를 알고하지 않습니다), 다음 C를 사용하여 바이너리 파일을 작성하는 가장 좋은 방법은 무엇입니까 + +?
나는 당신이 당신의 가정에 동일한 바이트 순서를 추가해야한다고 생각한다. 아니면 내가 완전히 떨어져 있습니까? –
@ TheScottMachine : Space_C0wb0y가 맞습니다. 가정에 동일한 바이트 순서를 추가하십시오. – Stan
감사합니다. 명확한 추가 가정을 추가했습니다. – TheScottMachine