2017-12-23 16 views
-1

설명서에는 FILE이 스트림을 식별하는 개체 유형이라고 나와 있습니다. 따라서 FILE과 연결된 스트림 객체를 가져올 수 있습니까?FILE로 식별되는 스트림 객체를 얻는 방법은 무엇입니까?

예를 들어, 내가 더 일반적으로 나는이 같은 일을 주어진 스트림을 리디렉션하고 여기에 사용자 지정 streambuf을 설정하는 함수를 작성하려는 등 stderr에서 stdoutFILE 포인터, 또는 std::cerr에서 std::cout 객체를 좀하고 싶습니다 : 두 PARAM 때문에,이 개 매개 변수를 가지고 중복 보인다

redirect(stdout, std::cout); 
redirect(stderr, std::cerr); 

스트림을 리디렉션

void redirect(FILE* file, std::ios stream) { 
    freopen_s((FILE**)file, "CONOUT$", "w", file); 
    stream.rdbuf(customBuffer); 
} 

을 사용 eters는 항상 서로 연관되어 있습니다.

+1

왜 처음부터 파일 스트림을 사용하지 않습니까? –

+0

std :: fstream뿐만 아니라 모든 함수가 모든 I/O 스트림에서 작동하므로 표준 스트림을 리디렉션 할 수도 있습니다. – krsi

답변

0

C++에서이 작업을 수행 할 수는 없지만 이와 같은 작업을 수행 할 수는 있습니다.

FILE * file = popen("someFile") 
const unsigned BUFF = 2048; 
string total; 
bool done = false; 
while (!done) { 
    vector<char> cBuf[BUFF]; 
    size_t read = fread((void *)&cBuf[0], 1, BUFF, f); 
    if (read) 
    { 
     total.append(cBuf.begin(), cBuf.end()); 
    } 
    if (read < BUFF) 
    { 
     done = true; 
    } 
} 
pclose(f); 
istringstream filey(total); 

희망이 도움이됩니다.

5

C++ 표준 라이브러리에는 C 표준 라이브러리가 포함되어 있습니다. FILE은 C 스트림으로 C++ iostream과는 아주 다른 동물입니다. std::stream 구현은 기본이되는 FILE을 사용하는 것이 가능하지만, 표준에서는 필요하지 않으며이 경우에도 검색 할 방법이 없습니다.

명시 적으로 기본이되는 FILE *을 사용하는 사용자 정의 std::streambuf을 빌드하고 std::stream에서 사용할 수 있습니다. std::basic_streambuf은 C++ 표준 라이브러리에서 사용자 지정 파생 클래스의 기본 클래스로 명시 적으로 디자인 된 소수의 클래스 중 하나입니다. 불행히도 그것에 대한 튜토리얼을 찾을 수는 없지만,이 클래스는 단지 오버라이드해야만하는 많은 가상 메소드를 포함합니다. 정확히 쉬운 경로는 아니지만, 일부 작업, 무거운 테스트 및 궁극적으로 어딘가에 갇히게되면 결국 도움이 될 수 있습니다. 그러나 완전한 구현은 SO 대답을 훨씬 뛰어 넘습니다.

TL은/DR : 한 FILE와 관련된 기본 std::stream이 없지만 몇 가지 작업과 함께 당신은 기본 FILE *를 사용하는 사용자 정의 stream_buffer을 구축 할 수 있습니다. 그것들은 다소 고급 작업이지만 ...