Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проеобразование типов: LARGE_INTEGER в std::string


Автор: Alca 24.11.2008, 18:49
Проеобразование типов: LARGE_INTEGER (__int64) в std::string?

Автор: Rififi 24.11.2008, 19:01
Код
LARGE_INTEGER li;
char buf[100] = { '\0' };
i64toa_s(li.QuadPart, buf, sizeof(buf) / sizeof(buf[0]), 10);
std::string s = buf;

Автор: Alca 24.11.2008, 19:04
А возможно сделать через потоки, что-то вроде такого, тока с __int64?
Код

template <typename T> std::string toString(T val) {
    std::ostringstream oss;
    oss << val;

    return oss.str();
}

Автор: sQu1rr 24.11.2008, 19:24
Цитата(Alca @  24.11.2008,  19:04 Найти цитируемый пост)
А возможно сделать через потоки, что-то вроде такого, тока с __int64?

А какой смысл через потоки, если можно через itoa (в данном случае i64toa_s)?  smile 

Автор: jonie 24.11.2008, 19:25
Цитата

А возможно сделать через потоки, что-то вроде такого, тока с __int64?

а они не понимают __int64 ?

Автор: Rififi 24.11.2008, 19:26
Alca
А возможно сделать через потоки, что-то вроде такого, тока с __int64?
Возможно.
Сделай специализацию шаблона для типа LARGE_INTEGER. Внутри будет то же самое.

Автор: Alca 25.11.2008, 10:08
Цитата

А какой смысл через потоки, если можно через itoa (в данном случае i64toa_s)

А если размер размер буфера будет больше 100?
Цитата

а они не понимают __int64 ?

Код

LARGE_INTEGER liVal;
std::ostringstream oss;
oss << liVal;
std::string sTemp = oss.str();

Код

Error    1    error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'LARGE_INTEGER' (or there is no acceptable conversion)

Автор: Pulse69 25.11.2008, 10:42
LARGE_INTEGER это union, так что, естественно, operator << его не понимает.
Нужно написать
Код

LARGE_INTEGER liVal;

// ....инициализация....

std::ostringstream oss;
oss << liVal.QuadPart;
std::string sTemp = oss.str();


Автор: Alca 25.11.2008, 10:55
Код

std::string sInt64ToStr(LARGE_INTEGER liVal) {
    std::ostringstream oss;
    oss << liVal.QuadPart;
    return oss.str();
}
//....
/*......*/{
    LARGE_INTEGER liFinish;
    QueryPerformanceCounter(&liFinish);

    LARGE_INTEGER liFreq;
    QueryPerformanceFrequency(&liFreq);

    std::string sStr = sInt64ToStr((liFinish.QuadPart - m_liStart.QuadPart) / liFreq.QuadPart);
}

Код

Error    1    error C2664: 'sInt64ToStr' : cannot convert parameter 1 from 'LONGLONG' to 'LARGE_INTEGER'

Автор: Rififi 25.11.2008, 11:21
Код
template <typename _E, typename _Tr>
std::basic_ostream<_E, _Tr>& operator << (std::basic_ostream<_E, _Tr>& os, const LARGE_INTEGER& li)
{
    return os << li.QuadPart;
}

LARGE_INTEGER li = {1234567890};
std::stringstream ss;
ss << li;
std::string s = ss.str();

Автор: Alca 26.11.2008, 11:36
Сп. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)