文字列全体を読むためにはstd ::にstringstream演算子を>>強制的にどのように?

StackOverflow https://stackoverflow.com/questions/1136359

質問

の代わりに最初の空白で停止の文字列全体を読むためには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;
  }
  /* ... */
};

私は、設定/設定解除ストリームフラグを試みたが、それは助けにはならなかった。

を明確化

クラスは、テンプレートの1つのインスタンスが、それはまた、同様に他のタイプをサポートする必要がありれる型T.文字列への/からの自動変換を有する容器のテンプレートです。私がのstd :: getlineのの行動を模倣するために>>演算子を強制したい理由がある。

役に立ちましたか?

解決

オペレータは>> Tは=文字列、我々は[T =文字列]の場合の具体的な関数を書くことができ、当社の要件を満たしていないとして。これは、正しい解決策ではないかもしれません。しかし、作品としての周りに言及しています。

それはあなたの条件を満たしてない場合は、

私を修正してください。

私は以下のようにサンプルコードを書かれています:

#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 ++ニュースグループの元のポスターのおかげで)

どこでそれを停止したいのですか?あなたは全体のラインを読みたい場合は、必要がある場合、あなたはおそらく、のgetline の機能を必要としますstreamstringに保存されている文字列全体は、あなたの一品オブジェクト ostringstream :: strのの方法です。

私はあなたがT = std::stringとそのテンプレートをインスタンス化していると仮定しています。その場合、あなたはのgetlineを使用することができます:

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

しかし、これはあなたが文字列の有効な部品としてNUL-文字を受け付けません想定しています。

そうでなければ、 `T」のために、独自の抽出を書くことができます。

私は除外書いて、あなた自身のファセットの承知している事業者との双方向>>ありません(演算子>>最初の文字で停止したisspace(Cのために、getlocは())が真です)。しかし、あなたが望む行動を持っている<文字列>でのgetline関数があります。

あなたが使用できる場合は <のhref = "http://www.boost.org/docを使用し、その後を後押し/libs/1_48_0/doc/html/boost_lexical_cast.html」のrel = "" nofollowを>ブースト:: lexical_castはこちらます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top