LINUX.ORG.RU

чтение из потока с ограничением символов

 , istream


0

3

сабж. как в крестах организовать сишный аналог

int i;
const char *str = "10203040";
sscanf(str, "%02d", &i);
assert(i == 10);

чтобы можно было писать

istringstream ss("1020304050");
int i;
ss >> i;
assert(i == 10);

т.е нужна какая-то обратная вещь к setw. предполагается использовать вкупе со стандартными алгоритмами, поэтому вариант sscanf не подходит. благодарю.

★★★★★
Ответ на: комментарий от anonymous

Get/Set floating-point decimal precision

и при чем тут это?

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от frozenix

ну это убого. говорю же, хочу использовать со стандартными алгоритмами, например с copy.

string str = "1020304050";
vector<int> data;
istringstream ss(str);
copy(istream_iterator<int>(ss), istream_iterator<int>(), back_inserter(data));
assert(data == {10,20,30,40,50});

а с твоим вариантом copy придется вызвать str.size() / 2 раз.

vvviperrr ★★★★★
() автор топика
Ответ на: комментарий от deadline

The field width determines the minimum number of characters to be written in some output representations

minimum number of characters

minimum

это аналог манипулятора setw. а мне нужно как-то ограничить МАКСИМУМ. свой манипулятор если только писать. думал стандартные средства позволяют это сделать.

vvviperrr ★★★★★
() автор топика
Последнее исправление: vvviperrr (всего исправлений: 1)

Для стандартных istringstream не предусмотрено использование setw, так что нужно унаследовать и дописать как-нибудь так:

#include <alloca.h>
#include <iomanip>
#include <iostream>
#include <sstream>

struct istringstream: public std::istringstream {
    explicit istringstream(std::string s) : std::istringstream(s) {}
};

istringstream& operator>>(istringstream &ss, std::_Setw w)
{
    ss.width(w._M_n);
    return ss;
}

template <class T>
istringstream& operator>>(istringstream &ss, T &x)
{
    if (ss.width() == 0) {
        static_cast<std::istringstream&>(ss) >> x;
    } else {
        char *f = (char*)alloca(ss.width() + 1);
        ss.read(f, ss.width());
        f[ss.gcount()] = 0;
        std::istringstream fs(f);
        fs >> x;
    }
    return ss;
}

int main()
{
    istringstream ss("102003000");
    int a, b, c;
    ss >> std::setw(2) >> a >> std::setw(3) >> b >> std::setw(4) >> c;
    std::cout << a << ", " << b << ", " << c << std::endl;
}
quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.