귀하의 책은별로 도움이되지 않습니다.
1) 출력 스트림은 std::streambuf
으로 바이트를 보내고, 에는 버퍼가 포함될 수 있습니다. 및 std::ofstream
에 의해 사용 된 std::filebuf
(streambuf
으로부터 유도 됨)은 일반적으로 버퍼링 될 것이다. 즉, 을 출력하면 문자가 즉시 출력되는 것은 아닙니다. flush()
(직접 또는 간접적으로 std::endl
을 사용하여) 스트림을 호출하여 flush()
을 명시 적으로 요청하면 버퍼에 이 가득 찼을 때만 버퍼에 쓰여지고 운영 체제에 출력됩니다. 그러나 이것은 다를 수 있습니다. std::cout
에 출력 stdout
와 동기화되며, 대부분의 구현은 더 많거나 적은 출력 대화 형 장치에가는 경우 버퍼링 방식을 변경, std::cout
에 대한 stdout
의 규칙을 따릅니다.
어쨌든 확실하지 않은 경우 출력 이 실제로 프로그램에서 나가기를 원하면 flush에 대한 호출을 추가하기 만하면됩니다.
2) 책이 잘못되었습니다.
버퍼링 전략 중 하나는 unitbuf
입니다. 이 설정하거나 (당신이 std::ostream
개체에서이 함수를 호출 할 수 있도록 std::ios_base::set()
및 std::ios_base::unset()
— std::ios_base
이 std::ostream
의 기본 클래스입니다) 재설정 할 수있는 std::ostream
의 플래그입니다. unitbuf
가 설정되면, std::ostream
모든 출력 기능의 끝에 flush()
에 대한 호출을 추가, 그래서 당신은 쓸 때 :
스트림 문자열 의 모든 문자
후 플러시됩니다 std::cerr << "hello, world";
출력 제공된 unitbuf
이 제공됩니다. 시동시 unitbuf
은 에 대해 으로 설정됩니다. 기본적으로 다른 파일에는 설정되어 있지 않습니다. 그러나 은 원하는대로 설정하거나 해제 할 수 있습니다. 을 std::cerr
에 설정하지 말 것을 권장하지만, 대화 형 장치에 std::cout
을 출력하는 경우에는 거기에 설정하는 것이 좋습니다.
여기서 질문의 모든 것은 streambuf
에있는 버퍼입니다. 일반적으로 OS는 버퍼도 제공합니다. 버퍼를 플러시하는 것은 모두 문자를 OS로 전송하는 것입니다. 이 사실은 트랜잭션 무결성이 필요할 때 ofstream
을 직접 사용할 수 없다는 것을 의미합니다.
3) 문자열이나 >>
를 사용하여 문자 버퍼에 입력 한 다음 std::istream
최초의 공백을 선도 건너 뛰고가 에 있지만 다음에 공백을 포함하지 않는 입력. 표준의 공식적인 용어에서는 스트림에서 문자를 "추출"하여 을 다시 볼 수 없습니다 (스트림이 지원하는 경우 검색하지 않는 한). 다음 입력은 이전에 중단 된 부분을 픽업합니다. 다음 문자가 버퍼에 있거나 디스크에 남아 있는지 여부는 실제로는 과 관련이 없습니다. 그것은 여러 가지 수준 발생하고, OS 레벨에서, 장치에 따라 다양한 형태를 취한다는 점에서 입력 버퍼링이 다소 복잡
참고. 일반적으로 OS는 파일을 개의 섹터로 버퍼링하며, 종종 여러 섹터를 미리 읽습니다. OS는 항상 파일 끝에 도달하지 않는 한 만큼 많은 문자를 반환합니다. 대부분의 OS는 키보드를 한 줄씩 버퍼링합니다. 읽기 요청에서 전체 라인이 입력 될 때까지 읽기 요청을 반환하지 않으며 읽기 요청에서 현재 행의 끝을 넘어 문자를 반환하지 않습니다.std::ostream
과 동일하게
std::istream
는 각각의 개별 특성을 얻기 위해 하나를 사용하여, 출력을위한 streambuf
이용한다. 이 std::cin
인 경우 일반적으로 filebuf
이됩니다. istream
이 문자를 요청하면 filebuf
은 에 문자가있는 경우 해당 문자를 버퍼에서 하나를 반환합니다. 그렇지 않은 경우, 버퍼를 다시 채우려 고 시도 할 것이다. 은 예를 들어. 512 (또는 버퍼 크기가 무엇이든간에) OS의 문자. 위에서 설명한대로 기기의 버퍼링 정책에 따라 응답합니다. std::cin
가 키보드에 연결되어, 당신은 당신이 입력 한 모든 문자가 결국 스트림에 의해 을 읽을 수 있습니다, "hello world"
를 입력 한 경우 여하튼
. (당신이 >>
를 사용하는 경우, 당신은 볼 수 없습니다
공백이 많이 이있을 수 있습니다.)
표준 참고 : 기본적으로'cout'가 stdio''와 동기화 및 기본입니다' stdio'는 라인 버퍼입니다. – ybungalobill
사실, 두 번째 예제에서는 알 수없는 위치에서 메모리에 쓸 것이므로 정의되지 않은 동작이 발생합니다. ** 잘하면 ** 충돌이 발생합니다. –