의 입력 파일 스트림을 여는 I는 추출 조작 이진 모드로 열 입력 스트림에 사용해서는 안 알지만 멤버 함수 read
대신 사용하여야한다.skipws 플래그가 설정된 바이너리 모드
std::ifstream ifs("file.bin", std::ios::in | std::ios::binary);
char c;
ifs >> c; // Should not be used
ifs.read(&c, 1); // OK
어쨌든 수행 할 수 있습니다. 그래서 내 질문에 바이너리 모드에서 열 때 입력 파일 스트림에 skipws 플래그를 해제하지 않는 이유는 무엇입니까?
내가 바이너리로 파일을 알고있는 것처럼이며, 따라서 바이너리 입력 스트림으로부터 추출 된 첫 번째 문자가 공백 (가 0x20)하지 살 때 같이, 당황있어 나는 기대하고 있었다. 만약 당신이 말한대로 C++ 표준을위한 바이너리 모드가 고려된다면 괜찮습니다. 그러나 여전히 수수께끼 일 것입니다 : –
"시스템은 바이너리와 텍스트 스트림 사이에서 전혀 구별 할 필요가 없습니다"- 그리고 IIRC Posix는 FILE * 파일 설명자를 사용하면 텍스트로 열린 파일과 이진 모드간에 차이가 없습니다. skipws 비트가 설정되고 텍스트가 아닌 바이너리 파일로 인해 C++ 파일 스트림의 창 밖으로 나가면 수치 스러울 것입니다. 나는 기본적으로 충돌이 있다고 생각한다 - 바이너리 모드는 "내 파일의 바이트를 망칠 필요가 없다"고 말하지만, "operator >>는"오, 네 모든 방법을 망쳐 놓는다. "라고 말한다. 그러므로 그들을 섞어서는 안된다는 충고입니다. –
@SteveJessop : 이진 모드가 저수준 함수로 수행하는 변환을 보는 것이 더 도움이된다고 생각합니다. 결국,'streambuf' 레벨 아래에서 발생합니다.'istream' 레벨에서는'operator >>'가 작동하지 않습니다. 'operator >>는 형식화 된 입력 함수이므로 상위 레벨에서 구문 분석을 수행합니다. 문자를 문자로 읽고 싶다면, 포맷되지 않은 읽기 기능 (예 :'get' 함수 중 하나)을 원하지만 여전히 텍스트 파일로 작업 중일 수 있습니다. 필자는 텍스트 모드 파일을 사용했지만 여러 응용 프로그램에 대해 낮은 수준의'streambuf :: sbumpc' 인터페이스를 사용했습니다. –