Как вызвать станд.:: оператор stringstream>> для чтения всей строки?

Сокет = IP-адрес + порт (числовой адрес)
Вместе они определяют конечную точку для сетевого соединения на машине. (Я просто заваливал сеть 101?)

7
задан Saulius Žemaitaitis 16 July 2009 в 09:27
поделиться

5 ответов

Поскольку оператор >> не удовлетворяет нашему требованию, когда 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;
}
6
ответ дан 6 December 2019 в 12:53
поделиться

Вот решение:

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 ++)

5
ответ дан 6 December 2019 в 12:53
поделиться

Где вы хотите, чтобы это остановилось? Если вы хотите прочитать всю строку, вам, вероятно, понадобится функция getline , если вам нужна целая строка, хранимая в объекте streamstring, ваш выбор - метод ostringstream :: str .

2
ответ дан 6 December 2019 в 12:53
поделиться

Я предполагаю, что вы создаете экземпляр этого шаблона с помощью T = std :: string . В этом случае вы можете использовать getline:

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

Однако это предполагает, что вы не будете принимать нулевые символы как допустимые части строки.

В противном случае вы можете написать свой собственный экстрактор для `T '.

1
ответ дан 6 December 2019 в 12:53
поделиться

Не существует способа с оператором >>, который, как мне известно, исключал бы запись вашего собственного фасета (оператор >> остановить на первом символе, для которого ispace (c, getloc ()) является правда). Но в есть функция getline, которая ведет себя так, как вы хотите.

1
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: