문제

std :: stringstream 연산자 >> 첫 번째 공백에서 멈추지 않고 전체 문자열을 읽는 방법은 무엇입니까?

텍스트 파일에서 읽은 값을 저장하는 템플릿 클래스가 있습니다.

template <typename T>
class ValueContainer
{
protected:
  T m_value;

public:
  /* ... */
  virtual void fromString(std::string & str)
  {
    std::stringstream ss;
    ss << str;
    ss >> m_value;
  }
  /* ... */
};

스트림 플래그를 설정/설정하지 않았지만 도움이되지 않았습니다.

설명

클래스는 T 형으로 자동 변환 된 컨테이너 템플릿입니다. Strings는 템플릿의 하나의 인스턴스 일 뿐이므로 다른 유형도 지원해야합니다. 그렇기 때문에 운영자 >> std :: getline의 동작을 모방하도록 강요하고 싶습니다.

도움이 되었습니까?

해결책

t = string 일 때 연산자 >>가 요구 사항을 충족하지 않으므로 [t = string] 케이스에 대한 특정 함수를 쓸 수 있습니다. 이것은 올바른 솔루션이 아닐 수 있습니다. 그러나 주변의 작업이 언급했듯이.

요구 사항이 충족되지 않으면 저를 수정하십시오.

다음과 같이 샘플 코드를 작성했습니다.

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

template <class T>
class Data
{
    T m_value;
    public:
    void set(const T& val);
    T& get();
};

template <class T>
void Data<T>::set(const T& val)
{
    stringstream ss;
    ss << val;
    ss >> m_value;
}

void Data<string>::set(const string& val)
{
    m_value = val;
}

template <class T>
T& Data<T>::get()
{
    return m_value;
}

int main()
{
    Data<int> d;
    d.set(10);
    cout << d.get() << endl;

    Data<float> f;
    f.set(10.33);
    cout << f.get() << endl;

    Data<string> s;
    s.set(string("This is problem"));
    cout << s.get() << endl;
}

다른 팁

다음은 해결책입니다.

std::istream & ReadIntoString (std::istream & istr, std::string & str) 
{ 
    std::istreambuf_iterator<char> it(istr), end; 
    std::copy(it, end, std::inserter(str, str.begin())); 
    return istr; 
} 

(C ++ NewsGroup의 원래 포스터 덕분에)

어디에서 멈추기를 원하십니까? 전체 라인을 읽고 싶다면 아마도 필요할 것입니다. getline 함수, 스트림 스트링 객체에 저장된 전체 문자열이 필요한 경우 선택의 Ostringstream :: str 방법.

나는 당신이 그 템플릿을 인스턴스화한다고 가정합니다 T = std::string. 이 경우 GetLine을 사용할 수 있습니다.

getline(ss, m_value, '\0');

그러나 이것은 NUL-Characters를 문자열의 유효한 부분으로 받아들이지 않을 것이라고 가정합니다.

그렇지 않으면`t '에 대한 자신의 추출기를 쓸 수 있습니다.

연산자에게는 방법이 없습니다. >> 자신의 패싯을 쓰는 것을 제외하고는 (연산자 >> IsSpace (c, getLoc ())가 사실 인 첫 번째 문자를 중지합니다). 그러나 GetLine 기능이 있습니다u003Cstring> 원하는 동작이 있습니다.

사용할 수있는 경우 후원 그런 다음 사용하십시오 부스트 :: lexical_cast.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top