Моя программа выполняет обычную задачу записи двоичных данных в файл в соответствии с определенным нетекстовым форматом файла. Поскольку данные, которые я записываю, уже не находятся в существующих фрагментах, а вместо этого собираются байт за байтом во время выполнения, я использую std::ostream::put()
вместо write()
. Я предполагаю, что это нормальная процедура.
Программа работает просто отлично. Он использует как std::stringstream::put()
, так и std::ofstream::put()
с двузначными шестнадцатеричными целыми числами в качестве аргументов. Но я получаю предупреждение компилятора C4309: «усечение постоянного значения» (в VC++ 2010) всякий раз, когда аргумент put()
больше 0x7f. Очевидно, что компилятор ожидает signed char
, а константа выходит за допустимые пределы. Но я не думаю, что на самом деле происходит какое-либо усечение; байт записывается так же, как и должен.
Предупреждения компилятора заставляют меня думать, что я делаю что-то не так, как принято. Ситуация, которую я описал, должна быть распространенной. Есть ли общий способ избежать такого предупреждения компилятора? Или это пример бессмысленного предупреждения компилятора, которое следует просто игнорировать?
Я подумал о двух неэлегантных способах избежать этого. Я мог бы использовать такой синтаксис, как mystream.put( char(0xa4) )
, при каждом вызове. Или вместо std::stringstream
я мог бы использовать std::basic_stringstream< unsigned char >
, но я не думаю, что этот трюк сработает с std::ofstream
, который не является шаблонным типом. Я чувствую, что здесь должно быть лучшее решение, тем более что ofstream
предназначен для записи двоичных файлов.
Твои мысли?
--ИЗМЕНИТЬ--
Ах, я ошибся насчет того, что std::ofstream
не является шаблонным типом. На самом деле это std::basic_ofstream<char>
, но я попробовал этот метод и понял, что он все равно не будет работать из-за отсутствия определенных методов и полиморфной несовместимости с std::ostream
.
Вот пример кода:
stringstream ss;
int a, b;
/* Do stuff */
ss.put( 0 );
ss.put( 0x90 | a ); // oddly, no warning here...
ss.put( b ); // ...or here
ss.put( 0xa4 ); // C4309