2011-08-31 2 views
2

의 입력 파일 스트림을 여는 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 플래그를 해제하지 않는 이유는 무엇입니까?

답변

4

std::ios_base::binary으로 제어되는 "바이너리"모드는 파일에 저장된 표준 C++ \n 문자와 시스템 특정 줄 바꿈 시퀀스 사이의 줄 바꿈을 해제하기위한 것입니다.

그것은 당신이 함께 기능의 두 개의 직교 조각을 묶어 할 이유가 없다, 그래서 의미있는 분리 공백 또는 일부 완전히 다른 바이트 형식이 포함 된 파일을 구문 분석 여부에 완전히 독립적이다.

(C++ 표준은 바이너리 모드의 의미에 대해 많이 언급하지는 않지만, C 스트림에서 텍스트 스트림과 이진 스트림 간의 잠재적 인 차이점에 대해 자세히 설명합니다. 이진 스트림은 바이트 단위로 바이트를 다시 읽어야합니다. 텍스트 스트림은 줄 바꿈 이전에 여분의 공백을 두지 않고 줄 바꿈 및 탭 이외의 제어 문자를 사용하지 않는 여러 가지 제한 사항을 감안할 때만 주어진 시스템에서 작성됩니다. 시스템은 바이너리 텍스트 스트림.) 그 내용이 텍스트로 해석 할 수 없습니다에 대한

+1

내가 바이너리로 파일을 알고있는 것처럼이며, 따라서 바이너리 입력 스트림으로부터 추출 된 첫 번째 문자가 공백 (가 0x20)하지 살 때 같이, 당황있어 나는 기대하고 있었다. 만약 당신이 말한대로 C++ 표준을위한 바이너리 모드가 고려된다면 괜찮습니다. 그러나 여전히 수수께끼 일 것입니다 : –

+1

"시스템은 바이너리와 텍스트 스트림 사이에서 전혀 구별 할 필요가 없습니다"- 그리고 IIRC Posix는 FILE * 파일 설명자를 사용하면 텍스트로 열린 파일과 이진 모드간에 차이가 없습니다. skipws 비트가 설정되고 텍스트가 아닌 바이너리 파일로 인해 C++ 파일 스트림의 창 밖으로 나가면 수치 스러울 것입니다. 나는 기본적으로 충돌이 있다고 생각한다 - 바이너리 모드는 "내 파일의 바이트를 망칠 필요가 없다"고 말하지만, "operator >>는"오, 네 모든 방법을 망쳐 놓는다. "라고 말한다. 그러므로 그들을 섞어서는 안된다는 충고입니다. –

+0

@SteveJessop : 이진 모드가 저수준 함수로 수행하는 변환을 보는 것이 더 도움이된다고 생각합니다. 결국,'streambuf' 레벨 아래에서 발생합니다.'istream' 레벨에서는'operator >>'가 작동하지 않습니다. 'operator >>는 형식화 된 입력 함수이므로 상위 레벨에서 구문 분석을 수행합니다. 문자를 문자로 읽고 싶다면, 포맷되지 않은 읽기 기능 (예 :'get' 함수 중 하나)을 원하지만 여전히 텍스트 파일로 작업 중일 수 있습니다. 필자는 텍스트 모드 파일을 사용했지만 여러 응용 프로그램에 대해 낮은 수준의'streambuf :: sbumpc' 인터페이스를 사용했습니다. –