如何强制使用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类型。字符串只是模板的一个实例,它也必须支持其他类型。这就是为什么我想强制运算符&gt;&gt;模仿std :: getline的行为。
答案 0 :(得分:6)
作为运算符&gt;&gt;当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;
}
答案 1 :(得分: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 ++新闻组中的原创海报)
答案 2 :(得分:2)
你希望它停在哪里?如果你想读一整行你可能需要getline函数,如果你需要存储在streamstring对象中的整个字符串,你的选择是ostringstream::str方法。
答案 3 :(得分:1)
运营商没有办法&gt;&gt;我知道除了编写自己的方面(运算符&gt;&gt;停止在第一个字符,其中isspace(c,getloc())为真)。但是&lt; string&gt;中有一个getline函数。它有你想要的行为。
答案 4 :(得分:1)
我假设您使用T = std::string
实例化该模板。在这种情况下,您可以使用getline:
getline(ss, m_value, '\0');
但是,这假设您不接受空字符作为字符串的有效部分。
否则你可以为`T'编写自己的提取器。
答案 5 :(得分:1)
如果您可以使用Boost,请使用boost::lexical_cast。