2009-05-22 7 views
4

나를 때리는 퍼즐. 간단한 테스트 하네스 코드에서 stdout에 너무 많은 문자를 스트리밍하면 프로그램이 실패합니다. 이상하지만 매우 재현 가능합니다. 이것은 Windows 만 문제가 될 수 있지만 쉽게 볼 수있다 :Cout 스트림 제한?

#include <iostream> 
#include <deque> 

using namespace std; 

int main() 
{ 
    deque<char> d; 
    char c; 

    while (cin.get(c)) d.push_back(c); 

    for (deque<char>::reverse_iterator j = d.rbegin(); j != d.rend(); j++) 
    cout << (*j); 
} 

앞의 코드는 단지 표준 입력에서 문자의 스트림을로드하고 역순으로 출력합니다. 최대 100K 정도의 문자까지 제대로 작동하지만 더 큰 파일의 경우 Windows에 "stdout을 쓰는 중 오류가 발생했습니다"라는 메시지와 함께 사망합니다. 그것은 항상 같은 성격으로 죽습니다. "cat bigfile.txt | reverse.exe"와 같은 쉘 명령은 문제를 재현하는 데 필요한 것입니다. MSFT와 Intel 컴파일러 모두 비슷한 기능을합니다.

버퍼가 stdout에있을 수 있지만 버퍼가 채워지면 자동으로 플러시되지 않아야한다는 것을 알고 있습니까? 여기

+1

컴파일러 버전, OS 및 실행중인 메모리에 대한 자세한 정보가 필요합니다. 적어도 우리 부부는이 문제를 보지 못하고 있습니다. –

+0

또한 "reverse.exe

답변

0

특히 마이클 버 (Michael Burr)에게 올바른 제안을 해주셔서 감사합니다. reverse.exe가 아닌 cat 명령이 실패했을 수도 있습니다! 그게 정확히 뭐지 .. reverse.exe < bigfile.txt 잘 작동하지만 고양이 bigfile.txt | reverse.exe는 "stdout을 쓰는 중 오류"와 함께 실패합니다. 이제 CAT가 실패하는 이유는 수수께끼이지만 적어도 지금은 관련 코드가 아닙니다.

+3

다른 사람들이 문맥에서 볼 수 있도록 원래의 질문에 대한 편집으로 이러한 관찰을 추가 할 수 있다면 더 유용 할 것입니다. 당신의 '고양이'는 어디서 왔습니까? 내 것은 Cygwin 배포판에 있습니다. –

1

그러한 문제 :

C:\Temp> cl 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 

편집 : 추가 정보

난 당신이 게시 된 프로그램을 컴파일하여 테스트합니다. 나는를 100,000 번 반복하여 만든 파일을 만들었습니다 (크기는 1,000,000 바이트입니다). 다음, 나는 아무 문제가 없었다

C:\Temp> t.exe <test.in> test.out 

C:\Temp> t.exe < test.in 

뿐만 아니라

C:\Temp> cat test.in | t.exe 

을 달렸다. 그러나 1,000,000 자까지 스크롤 할 때까지 꽤 오래 걸렸습니다.

+0

Vista x64에서 80x86 용 Microsoft (R) 32 비트 C/C++ 최적화 컴파일러 버전 15.00.30729.01도 문제되지 않습니다. –

+0

우수하고 철저한 테스트! 확인해 주셔서 감사합니다. – SPWorley

0

각 루프 반복 중 잠시 동안 또는 100 회 반복 할 때마다 잠들 수 있습니까? 이렇게하면 OS가 버퍼를 플러시 할 수 있습니다.

나는이 작업을 수행하는 명령이 C++로 뭔지 모르겠지만, C#에서이

System.Threading.Sleep(10); 
4

당신은 그것의 내용이 방식으로 플러시 버퍼를 강제로 시도 할 수 있습니다 :

cout << (*j) << std::flush; 

그렇지 않으면 std::endl도 사용할 수 있지만 줄을 제공하고 끝내기도합니다 (원하지 않는 것 같습니까?)

0

win32에서 stdout에 특수 문자를 쓰려고하면이 문제가 발생합니다. 테스트 데이터에있는 이러한 문자는 무엇입니까?

1

문제는 아마도 "cat"이 아닌 파이프 연산자 (|)가 될 것입니다. Windows 명령 인터프리터 [1]에는 Unix와 같은 실제 파이프가 없으며 임시 파일을 사용하여 시뮬레이트합니다. 디스크 공간이 부족하거나 명령 인터프리터의 일부 버퍼가 넘칠 수 있습니다.

"bigfile.txt | reverse.exe"를 입력하여 동일한 결과가 나타나는지보십시오.

[1] 적어도 이전 버전에는 실제 파이프가 없습니다. 나는 최신 버전을 보지 않았다. Michael Burr가 Vista x64에서 재현 할 수 없다는 사실은 흥미 롭습니다. 아마 MS가 문제를 해결했습니다.