2009-12-10 4 views
3

std :: cout을 stringstreams로 리디렉션하는 것과 관련하여 많은 게시물을 읽었지만 리디렉션 된 문자열을 읽는 데 문제가 있습니다.리디렉션 된 cout -> std :: stringstream, EOL을 보지 않았습니다.

std::stringstream redirectStream; 
std::cout.rdbuf(redirectStream.rdbuf()); 

std::cout << "Hello1\n"; 
std::cout << "Hello2\n"; 

while(std::getline(redirectStream, str)) 
{ 
    // This does not work - as the contents of redirectStream 
    // do not include the '\n' - I only see "Hello1Hello2" 
} 

초기 출력 내에서 새로운 줄을 고를 필요가 있습니다. 어떻게 할 수 있습니까?

감사합니다.

+1

귀하의 정보는 내 컴퓨터에서 작동합니다. (Visual C++ 2008) – KeatsPeeks

답변

3

잘 작동합니다.
참고 : std :: getline()은 '\ n'문자가 아닌 행을 읽습니다. 각 행을 읽은 후에 행 종결자가 제거됩니다. 그러나 루프는 각 줄마다 한 번 입력됩니다.

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::stringstream redirectStream; 
    std::streambuf*  oldbuf = std::cout.rdbuf(redirectStream.rdbuf()); 

    std::cout << "Hello1\n"; 
    std::cout << "Hello2\n"; 

    std::string str; 
    while(std::getline(redirectStream, str)) 
    { 
     fprintf(stdout,"Line: %s\n",str.c_str()); 
     // loop enter once for each line. 
     // Note: str does not include the '\n' character. 
    } 

    // In real life use RAII to do this. Simplified here for code clarity. 
    std::cout.rdbuf(oldbuf); 
} 

참고 : 표준 : : cout을 다시 이전 스트림 버퍼를 둘 필요가. 일단 문자열 스트림 'redirectStream'이 유효 범위를 벗어나면 버퍼가 파괴되어 std :: cout이 유효하지 않은 스트림 버퍼를 가리키게됩니다. std :: cout은 'redirectStream'보다 오래 있기 때문에 std :: cout이 유효하지 않은 객체에 액세스하지 않도록해야합니다. 따라서 가장 쉬운 해결책은 이전 버퍼를 되돌려 놓는 것입니다.

0

응답 해 주셔서 감사합니다. 나는 내가 뭘 잘못했는지 알 수 있습니다. 내 문제를 단순화하기 위해 많은 코드를 제거했기 때문에 실제로 작동하는 버전을 게시했습니다.

// Basically... 
std::string str; 
std::stringstream redirectstream; 
// perform the redirection... 
// ... 

while (!done) 
{ 
    while(std::getline(redirectStream, str)) 
    { 
    // stuff... 
    } 
    std::cout << "Hello1\n"; 
    std::cout << "Hello2\n"; 
} 

의 getline() 함수가 더 이상이 상황에서 유효한 것으로 나타납니다 나타납니다 : 내 실제 로직이 문제였다 보인다. 이걸 설명해 주시겠습니까?

나는 이것이 완전히 다른 문제라는 것을 알고 있으며 나쁜 초기 게시물을 오도하는 것에 대해 사과드립니다.

+1

스택 오버플로에 오신 것을 환영합니다. 답 부분은 질문에 대한 * 대답 *이며, 다른 대답에 대한 답변이나 후속 질문에는 해당되지 않습니다. 답변에 응답하려면 각 답변 아래에있는 "의견"섹션을 사용하십시오. (최소한의 평판은 당신 자신의 질문 페이지에 코멘트 할 때 포기됩니다.) 나는 당신이 게시 한 것이 정말로 문제가 아니었다는 것을 인정한 이후이 질문을 "더 이상 적합하지 않다"고 결론 지었다. 다시 시작하여이 "답"에 작성한 내용으로 * 새로운 * 질문을 게시하는 것이 좋습니다. (이미 답변이 있으니 * 편집 *하면 문제가 생깁니다.) –

관련 문제