2014-01-29 4 views
5

나는 이것에 대해 많은 주제를 알고 있지만 그 중 아무도 나를 도울 수 없다.Eclipse C++ 콘솔 인쇄 주문 리눅스

내 C/C++ 프로젝트 std::coutstd::cerr에 정보 (cout) 또는 오류 (cerr)를 인쇄하는 데 사용합니다. 하지만 실행하면 올바른 순서로 인쇄되지 않고 "그룹 인쇄"하는 것처럼 보입니다. 언젠가 모든 세르 (cerr) 다음에는 모든 시체 (cout)와 언젠가는 모든 시체 (cout)가 먼저 그 다음에 모든 세르 (cerr)가 있습니다.

각 줄마다 flush()을 시도했지만 작동하지 않습니다. (다행히도 매번 사용하는 것은 끔찍할 것입니다 ...). setvbuf(stdout, NULL, _IONBF, 0); 같은 문제를 시도했습니다 ...

직접 리눅스의 콘솔에서 프로그램을 실행하면 순서는 좋지만 일식 콘솔은 색상 때문에 더 유용합니다. 여기

코드 샘플이 예제 cerr에서

#include <iostream> 

int main(int argc, char** argv) 
{ 
    std::cerr << __LINE__ << std::endl; 
    std::cerr << __LINE__ << std::endl; 
    std::cout << __LINE__ << std::endl; 
    std::cerr << __LINE__ << std::endl; 
    std::cerr << __LINE__ << std::endl; 
    std::cout << __LINE__ << std::endl; 
} 

그리고 콘솔 인쇄

11 
12 
14 
15 
13 
16 

==> 잘못된 순서로 ... 전에 cout을

+4

이것은 일식과 관련된 문제 일 가능성이 큽니다. 'std :: endl'은 실제로'flush()를 야기합니다. FYI – Avery3R

+0

왜 두 개의 서로 다른 스트림에 인쇄 된 텍스트는 나타날 순서가 정의되어 있습니까? 아무런 보증은 없으며 콘솔에서 작업하는 것은 아마도 구현 세부 사항 일 것입니다. 똑같은 스트림에 "Info :"와 "Error :"라는 접두어를 붙이거나 인쇄하는 것만 큼 효과가 있습니다. –

+0

각 호출마다 잠금 (뮤텍스)을 사용하고 동작 방식을 확인하려고합니다. – Mercury

답변

0

좋아 상황이 같다 나온다 다음은 std::cout이 buffor에 추가되었으며 std::cerr은 그렇지 않습니다. std::cerr은 빠르며 세척 할 필요가 없습니다. 또한 std::cerrstd::cout은 다른 스트림을 사용합니다.

여기서 문제는 std::cerr이 즉시 나타나고 std:cout이 표시되기 전에 플러시해야한다는 것입니다.

+0

'std :: endl'은 스트림을 플러시하므로 줄 번호는 항상 순서대로 인쇄되어야합니다. – gurka