2017-11-02 17 views
-2

STDOUT 및 STDIN을 함수로 리디렉션하는 방법을 연구하는 데 시간을 할애했습니다.C++ STDIN을 함수로 리디렉션하는 방법

STDOUT을 콜백으로 리디렉션하는 과정에서 결국 STDIN을 콜백으로 리디렉션 할 수 없었지만 STDIN을 파일로 리디렉션하는 것 외에는 리소스를 찾을 수 없습니다.

미리 감사드립니다.

편집 : 나는 윈도우 폼이있는 사용자 지정 콘솔을 만들었고 메인 프로그램에 파이프를 연결했습니다. 난 이미 인쇄 사용하여 읽을 수있는이 :

Console::PrintLn("Hello World!"); 
std::string in; 
Console::ReadLn(in); 

하지만 내 목표는 예를 들어이 사용하는 것이다 :

std::string str; 
std::cin >> str; // Read string from custom console 
std::cout << str << std::endl; // Print string to custom console 
std::printf("Hi!"); // It should also work with printf 
+2

무엇을 의미합니까? "redirect"_ ?? 함수에'STDOUT'과'STDIN'을 사용할 수 없습니까? – user0042

+0

나는 내 질문을 분명히했다, 미안. –

+0

"실제로 함수에서 STDOUT과 STDIN을 사용하는 것"이 ​​무슨 뜻인지 이해가 안됩니다. 좀 더 명확히 해 주시겠습니까? –

답변

1

그래서, 나는 당신이 교차에서이 작업을 수행 할 수 있습니다 믿을 수 없어 플랫폼 방식.

기본적으로 수행하려는 작업은 stdinstdout을 실제로 입력 및 출력하는 대신 콘솔 입력 및 출력 루틴을 호출하는 것으로 바꾸십시오.

대부분이 정확하게 가능한 것은 아닙니다. 그 이유는 stdin과 stdout을 대체하더라도 충분하지 않다는 것입니다. stdin과 stdout을보다 직접적인 방식으로 조작하려고하는 프로그램의 부분이있을 수 있습니다.

유닉스 시스템에서 스레드와 파이프 또는 소켓 페어로이 문제를 해결할 것입니다. 그렇다면 dup2 시스템 호출을 사용하여 파일 설명자 0과 1을 대체합니다. 매우 어렵지 않은 프로그램은 콘솔을 우회 할 수 없습니다 (기본적으로 /dev/tty을 열어서 출력해야합니다).

Windows에서는이 문제를 완전히 해결하기 위해 무엇을 할 것인지 잘 모릅니다. freopen을 사용하여 stdinstdout을 바꿀 수 있습니다. 표준 라이브러리 호출을 사용하기 때문에 대부분의 코드에서 작동합니다. 그리고 cincout은 실제로 다른 스레드에서 실행 중일 수있는 C 코드와 상호 운용 될 수 있도록 아래에 C stdio를 사용하기로되어 있습니다. 비주얼 C에서 FILE */C++ 버전 stdio 라이브러리는 콜백에 IO를 리디렉션 할 수 있도록 할 수있는 모든 작업을 포함하는 경우

나는 확실하지 않다, 그래서 당신은 아마 여전히 어떻게 든 만들 파이프의 윈도우에 상응를 사용해야 할 것 이 일.

coutcin을 대체하려는 경우 streambuf 개체를 자신의 것으로 바꿔서 사용하면됩니다. 이 작업을 수행하는 방법을 정확히 모르겠지만 cincout 개체의 rdbuf member functions을 봐야한다고 생각합니다.

streambuf을 구현하는 것은 어렵지 않습니다. 나는이 일을 혼자서해야만했다. 불행하게도, 비록 코드가 특별히 여기서 다루고있는 것의 세부 사항에 특별한 내용을 담고 있지는 않지만 코드는 여전히 독점적이므로 붙여 넣을 수는 없습니다. 그러나 이에 대한 많은 예가 various code samples from a Josuttis book on the C++ standard library에 있습니다.

특별한 경우에 대해서는 underflow (입력 용)과 overflow (출력용) 함수에 과부하가 걸리고 streambuf가 완전히 버퍼링되지 않은 스트림buf를 사용했을 가능성이 있습니다.

+0

답변 해 주셔서 감사합니다. 내가 말한 것에 따르면 STDIN 및 STDOUT으로 원하는 것을 구현하는 데 어려움을 겪을 것입니다. 따라서 std :: cout 및 std :: cin을 리디렉션하는 것은 어떻습니까? –

+1

@RicardoAntunes :'cout'과'cin'을하는 방법으로 업데이트되었습니다. – Omnifarious

+1

@RicardoAntunes : 그리고 조금 더 자세히 설명합니다. :-) – Omnifarious