2009-07-03 9 views
0

우리는 콘솔에 많은 주석을 작성하는 복잡한 콘솔 기반 도구를 빌드합니다. 이러한 도구는 많은 양의 데이터를 처리하므로 실행 비용이 많이 들고 특히 반복적으로 실행해야하는 테스트 중에는 필요 이상으로 자주 수행하지 않습니다. 이러한 테스트 중에 검사 결과를 파일에 기록하여 검사 용 해설을 캡처합니다. C :> [ourcommand]> log.txt 응용 프로그램이 완료되면 실행됩니다.응용 프로그램이 충돌하는 경우 파일에 대한 Windows 콘솔 로깅이 끝나지 않습니다. 꼬리 끝을 보는 방법?

응용 프로그램이 충돌 (잘못된 메모리 참조 등)되면 Windows가 충돌의 시점에서 발생한 내용을 볼 수 없도록 주석의 끝 부분에서 로그 파일을 급하게 끕니다. 또한 같은 장소에서 콘솔 출력을 잘라냅니다. 따라서 잘린 로그 파일을 얻었을 때 최종 결과를 보려면 로그 파일없이이 작업을 다시해야합니다. 로깅하지 않으면 Windows가 콘솔 출력을 버퍼링하지 않는 것 같습니다.

로깅하는 동안 콘솔 출력을 버퍼링하지 않도록 Windows에 알리는 방법이 있습니까? 우리 응용 프로그램은 (Windows) C 런타임 시스템을 사용하고 잠시 후에 "setvbuf" 을 다음과 같이 사용했습니다. setvbuf (stdout, NULL, _IONBF, 0); 하지만 아무 소용이 없습니다.

답변

2

당신은 어떤 시점에서 콘솔의 버퍼를 플러시 할 수 있습니다

Console.Out.Flush(); 

TextWriter.Flush()를 사용합니다.

항상 이러한 상황이 발생하는지 확인해야하는 경우 WriteLine처럼 작동하지만 끝 부분에 플러시 문을 포함하는 콘솔에 대한 메소드를 작성하는 것이 매우 쉽습니다.


편집 :

당신은 언어를 지정하지 않은 ... 나는 C#을 사용하는 예를 작성하는거야.

C#에서

, 쉽게 같은 방법을 제공하는 정적 유틸리티 클래스 만들 수 : 그럼 그냥

public static class FlushingConsole { 
    public static void WriteLine(string format, params Object[] args) { 
     Console.WriteLine(format, args); 
     Console.Out.Flush(); 
    } 
    // Add other overloads as required 
} 

전화 :

FlushingConsole.WriteLine(....); 

같은 접근 방식은 꽤 많이 다른 언어에서 작동한다 ,뿐만 아니라.


편집 2 :

당신이 C++를 사용하고 있기 때문에, 관심을 가질 수있는 setvbuf 이외의 몇 가지 옵션이 있습니다.

먼저 수행하여 COUT의 버퍼링을 해제 할 수 있어야한다 : IOSTREAMS과 (printf와 IE)

cout.unsetf(ios_base::unitbuf); 

당신은 또한 당신이 표준 입출력을 혼합하는 경우 sync_with_stdio을 설정해야 할 수도 있습니다.

+0

그건 자바다고 생각되지만, 아마도 C 등급이 될 것입니다. 어쨌든, 그것은 우리가 충돌 전에 버퍼를 플러시한다는 것을 알고 있다고 가정합니다. 나는 그런 종류의 투시력을 가진 사람을 모른다. 우리는 확실히 그것을 가지고 있지 않습니다. 매번 플러싱을하는 것은 고통스럽고 (백만 회선 프로그램 임) 효과적인 해결책은 아닙니다. –

+0

"플러시를 퍼팅하는 것은 고통 스럽습니다."... –

+0

Ira : 이것은 .NET 용입니다 (참조는 C#/.NET입니다). 어떤 언어를 사용하고 있습니까? C#에서는 확장 메서드를 사용하여 쉽게이 작업을 수행 할 수 있었지만 플러시가 필요하지 않습니다. 표시하도록 수정하겠습니다. –

0

언어를 지정하지 않았지만 C++의 경우 버퍼링을 해제하는 첫 번째 매개 변수로 stdout을 사용하여 setvbuf을 호출 할 수 있어야합니다.

+0

우리는 그것을 사용했다. (위에서 언급 한 버퍼링 신호를 상기시켜 주셔서 감사 드리며, 나는 그 존재를 확인하기 위해 코드를 살펴 보았다.) 도움이되지 않습니다. –

+0

매우 이상합니다. 작동해야합니다. CRT 소스 코드가 있어야합니다. 단계별로 진행하고 버퍼링이 실제로 발생하지 않는지 확인합니다. – Michael

+0

자세한 내용은 setvbuf (원래 질문으로 편집)를 참조하십시오. 그것이 어떻게 불려지는지에 관해 우스운 이야기일까요? 나는 내가 배울 수있는 것을보기 위해 CRT 코드를 조사 할 것이다. –

0

겉으로보기에는 표준 출력을 사용하고 있습니다. "표준 오류"를 사용하는 것이 좋습니다.(C 라이브러리의 stderr, iostream의 cerr) 버퍼되지 않습니다. 또는 동기화 할 때마다 FlushFileBuffers (또는 아날로그)를 사용할 수 있습니다.

+0

예, 우리는 표준 출력을 사용하고 있습니다. 출력 해설은 실제로 오류 출력이 아니며 매우 큰 응용 프로그램입니다. 모든 출력을 stderr로 변경하는 것이 우리의 첫 번째 선택이 될 수 없습니다. 예, 알겠습니다. 문제는 해결되었지만 아무 것도하고 싶지는 않습니다. - {실제로 setvbuf와 같은 버퍼를 사용하지 않도록 한 번 호출하면 행복 할 것입니다. –