2017-04-03 5 views
0

나는 주로 ostream_iterator를 사용하여 C++에서 toString 메서드를 구현하고있다.출력을 ostream_iterator에서 문자열로 변환하려면 어떻게해야합니까?

std::ostream_iterator<int> output(std::cout, " "); 

콘솔로 인쇄 한 후 ostream_iterator의 출력을 문자열로 반환하고 싶습니다. 이 직접 변환이 가능합니까?

+0

아니, 당신은 대신 이제 stringstream에 출력 뭔가를 할 필요가있을 것이다' –

+0

예를 cout'. 내 대답의 샘플 코드. – Davislor

답변

2

이 직접 변환이 가능합니까? ostream_iterator가 한 방향으로 스트리밍 데이터를 전송하는 데 사용되기 때문에

나는, 아니, 생각, 그래서 대상이 경우 std::cout 당신은 다시 데이터를 얻을 수 ostream_iterator을 사용할 수 없습니다.

하지만 다른 목적지를 사용할 수 있습니다. ostringstream 개체를 만든 다음 두 출력에 모두 cout을 사용하고 원하는대로 다시 사용하십시오.

는 간단한 예를 생각해

std::stringstream buff; 
    std::ostream_iterator<int> output(buff, " "); 
    std::istringstream str("10 3 ABC 7 1"); 
    // just copy only first integer values from str (stop on the first non-integer) 
    std::copy(std::istream_iterator<int>(str), std::istream_iterator<int>(), output); 
    // output as a string to std output 
    std::cout << buff.str() << std::endl; 
    // do something else 
    buff.seekp(0, std::ios::end); 
    std::cout << "String size is " << buff.tellp() << std::endl; 
0

당신은 STL 컨테이너 인터페이스가 아닌 std::ostream 인터페이스를 사용하는 문자열과 같은 개체를 원하는 경우, 즉 std::stringstream, 또는 일반적인 래퍼로 사용되지 않는 std::strstream 가장 가까운 것은 그 cout <<을 사용하여 std::string으로 serialize 할 수있는 모든 항목을 std::stringstream에 쓰고 데이터를 다시 읽는 것이 좋습니다. 이것은 결국 적어도 하나의 값 비싼 사본을 만드는 것입니다. 여기에 구현입니다 : 문자열로 그 복사 그림과 같이

#include <cstdlib> 
#include <iostream> 
#include <iterator> 
#include <sstream> 
#include <string> 

using std::cout; 
using std::endl; 
using isit = std::istream_iterator<char>; 

template <typename T> std::string to_string(const T& x) 
// Must be able to print a T with std::ostream::operator<<. 
{ 
    std::stringstream buffer; 
    buffer << x; 

    const isit begin(buffer);  // The start of the stream object. 
    static const isit end;  // Default object is the end-of-stream iterator. 

    return std::string(begin, end); 
} 

int main(void) 
{ 
    const std::string output_string = to_string("Testing:") + " " + 
    to_string(1) + ", " + to_string(2ULL) + ", " + to_string(3.0) + 
    to_string('.'); 

    cout << output_string << endl; 
    return EXIT_SUCCESS; 
} 

당신은 다음 std::stringstream보다는 <<std::istream_iterator<char>에 작성하는 std::ostream_iterator<char>를 사용할 수 있습니다.

std::istream에서 std::istream_iterator으로 std::string으로 데이터를 쓸 수 있습니다. 일종의. 서식이 어색 할 수 있습니다. 당신이 반복자를 사용하여 std::string에서 데이터를 읽으려면

, 그 반복자 유형은 std::string::iterator하고 문자열의 전면에 반복자는 다른 STL 컨테이너처럼 s.begin()입니다.

출력 반복자와 문자열 모두에 보낼 데이터가 메모리에 저장되어있는 경우 다른 생성자 중 하나를 사용할 수 있습니다.

1

예, 단지 cout을 stringstream으로 바꾸면 문자열을 만들 수 있습니다.

std::stringstream ss; // #include <sstream> 
std::ostream_iterator<int> output(ss, " "); 
std::string s(ss.str()); 
관련 문제