我的程序执行将二进制数据写入文件,符合某种非文本文件格式的常见任务.由于我正在写的数据不是现有的块,而是在运行时逐字节地放在一起,我使用std :: ostream :: put()而不是write().我认为这是正常的程序.
该程序工作正常.它使用std :: stringstream :: put()和std :: ofstream :: put()和两位数十六进制整数作为参数.但是当put()的参数大于0x7f时,我会得到编译器警告C4309:“截断常量值”(在VC 2010中).显然,编译器正在期待一个有符号的char,并且该常量超出范围.但我不认为任何截断实际发生;该字节就像它应该写的一样.
编译器警告使我认为我不是以正常的,接受的方式做事情.我描述的情况必须是一个常见的情况.有没有常见的方法来避免这样的编译器警告?或者这是一个无意义的编译器警告的例子,应该被忽略?
我想到了两种不合理的方式来避免这种情况.我可以在每次调用时使用mystream.put(char(0xa4))的语法.或者不是使用std :: stringstream我可以使用std :: basic_stringstream< unsigned char>,但是我不认为这个技巧可以与std :: ofstream一起使用,而不是模板类型.我觉得在这里应该有一个更好的解决方案,特别是因为stream是为了编写二进制文件. 你的想法? – 编辑 – 啊,我错误地认为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