Моя программа выполняет общую задачу записи двоичных данных в файл, соответствующих определенному формату нетекстового файла. Поскольку данные, которые я пишу, уже не существуют в существующих фрагментах, а вместо этого складываются по байтам во время выполнения, я использую std::ostream::put() вместо write(). Я предполагаю, что это обычная процедура.
Программа работает отлично. В качестве аргументов используются как std::stringstream::put(), так и std::ofstream::put() с двухзначными шестнадцатеричными целыми числами. Но я получаю предупреждение компилятора C4309: "усечение постоянного значения" (в VС++ 2010), когда аргумент put() больше 0x7f. Очевидно, что компилятор ожидает signed char, а константа вне диапазона. Но я не думаю, что любое усечение на самом деле происходит; байт записывается так, как предполагалось.
Предупреждения компилятора заставляют меня думать, что я не делаю ничего обычным, принятым способом. Ситуация, которую я описал, должна быть общей. Есть ли общий способ избежать предупреждения о компиляторе? Или это пример бессмысленного предупреждения компилятора, который следует просто игнорировать?
Я подумал о двух непростых способах избежать этого. Я могу использовать синтаксис типа mystream.put( char(0xa4) ) для каждого вызова. Или вместо std::stringstream я мог бы использовать std::basic_stringstream< unsigned char >, но я не думаю, что трюк будет работать с std::ofstream, который не является шаблоном. Я чувствую, что здесь должно быть лучшее решение, тем более что ofstream предназначен для записи двоичных файлов.
Ваши мысли?
- EDIT -
А, я ошибся в том, что 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