Возможный дубликат:
Как я могу преобразовать двойной в строку в C ++?
Конвертировать double в строку C ++?
Тотальный С ++ и Win32 нуб здесь играют в Visual Studio 2012, так что терпите меня, потому что я иногда откусываю больше, чем могу пережевывать 🙂
У меня есть приложение Win32, которое просто настраивает окно, используя цикл peekmessage для обновления в реальном времени. Приложение работает нормально, и окно показывает нормально. Я хотел бы напечатать текст в строке заголовка окна, отображая количество кадров в секунду из класса часов / таймеров, который мне предоставили.
Я еще не выучил GDI / GDI + или Direct2D & DirectWrite для вывода текста и значений переменных в клиентскую область, поэтому сейчас мне нужен простой метод вывода некоторой базовой статистики в окно, и я подумал, что самый простой способ — обновить заголовок окна на этом этапе. Мой класс окна имеет метод SetTitle, который принимает std :: wstring, поэтому мне было интересно, как лучше построить строку из литерального текста и значений переменных, таких как double? Как вы можете догадаться, я также незнаком со строками, выходящими за рамки стандартного std: cout для консольных приложений.
Амазонка говорит мне мой святой «Книга Петцольда, 5-е издание» до 3 дней, поэтому любые советы будут с благодарностью, и вы попадете в мой список рождественских открыток в этом году.
Благодарю.
И для эффективности и для удобства выделенный StringWriter
класс предпочтительнее.
Например, с манжеты,
template< class Type >
static wstring stringFrom( Type const& o )
{
wostringstream stream;
stream << o;
return stream.str();
}
class StringWriter
{
wstring s_;
static wstring const& fastStringFrom( wstring const& s )
{ return s; }
static wchar_t const* fastStringFrom( wchar_t const* s )
{ return s; }
template< class Type >
static wstring fastStringFrom( Type const& o )
{
return stringFrom( o );
}
public:
template< class Type >
StringWriter& operator<<( Type const& o )
{
s_ += fastStringFrom( o );
return *this;
}
operator wstring const& () const { return s_; }
operator wchar_t const* () const { return s_.c_str(); }
};
Тогда используйте как
typedef StringWriter S;
foo( S() << L"pi = " << 3.14 );
Отказ от ответственности: код не тронут руками компилятора.
После того, как я уселся и углубился в поток ввода и вывода, я наконец нашел решение, которое, кажется, работает хорошо.
После включения <sstream>
в моем проекте я создал std::wstringstream myString;
объект.
В цикле реального времени моего приложения у меня был следующий код для форматирования строки и значения, поступающего из класса Clock, который я затем передал в GDI для распечатки в клиентскую область окна:
myString.clear(); // clear status bits
myString.str(L""); // Clear the string for reuse
myString << "FPS " << pGameClock->GetFrameRate();
TextOutW(GdiDeviceContext, x_pos, y_pos,
myString.str().c_str(),
myString.str().length());
В процессе обучения я быстро углубился в вывод простого текста GDI, поскольку у меня изначально были проблемы с обновлением свойства заголовка окна приложения с помощью winapi. SetWindowTextW
функция. Кажется, ему не нравится, когда он вызывается с высокой частотой в главном цикле, в результате чего моя система перестает отвечать на запросы при запуске программы, и, следовательно, возникает необходимость в изучении базового GDI для вывода в мою клиентскую область окна, а не в строку заголовка окна.
pGameClock->GetFrameRate();
Кстати, любезно предоставлена реализация класса часов и таймеров высокого разрешения, разработанного талантливым Ноэль Ллопис и представлены в Программирование игр Gems 4. (Спасибо Ноэль).
Я также обнаружил, что еще многое предстоит узнать о методах более производительного форматирования строк & методы построения, особенно применительно к требованиям в реальном времени в играх, но я подозреваю, что мне лучше будет http://gamedev.stackexchange.com (который я только недавно обнаружил) для дальнейших вопросов и помощи?
Книги, которые помогли этому C ++ noob лучше понять потоки ввода и вывода: