7

如何强制 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。字符串只是模板的一个实例,它还必须支持其他类型。这就是为什么我要强制运算符 >> 模仿 std::getline 的行为。

4

6 回答 6

6

由于运算符 >> 在 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;
}
于 2009-07-16T12:17:44.150 回答
5

这是一个解决方案:

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++ 新闻组中的原始海报)

于 2009-07-16T09:53:05.193 回答
2

你想让它停在哪里?如果您想读取整行,您可能需要getline函数,如果您需要将整个字符串存储在 streamstring 对象中,您的选择是ostringstream::str方法。

于 2009-07-16T09:19:57.413 回答
1

我不知道 operator>> 没有一种方法可以编写自己的构面(operator>> 在 isspace(c, getloc()) 为真的第一个字符处停止)。但是 <string> 中有一个 getline 函数,它具有您想要的行为。

于 2009-07-16T09:16:32.053 回答
1

我假设您正在使用T = std::string. 在这种情况下,您可以使用 getline:

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

但是,这假设您不会接受空字符作为字符串的有效部分。

否则,您可以为“T”编写自己的提取器。

于 2009-07-16T09:20:15.540 回答
1

如果您可以使用Boost ,请使用boost::lexical_cast

于 2011-11-24T07:51:31.107 回答