我的程序执行了一个常见的任务,即将二进制数据写入文件,遵循特定的非文本文件格式。由于我要写入的数据不是已经存在的块,而是在运行时一个字节一个字节地组合起来,所以我使用
该程序工作得很好。它使用
编译器警告让我觉得我没有按照正常、接受的方式做事。我描述的情况必须是普遍存在的。有没有一种常见的方法可以避免这样的编译器警告?还是这只是一个无意义的编译器警告,应该被忽略?
我想到了两种不优雅的方法来避免它。我可以在每次调用时使用类似
你的想法?
-编辑-
啊,关于
这是一个代码示例:
std::ostream ::put()
而不是write()
。我认为这是正常的过程。该程序工作得很好。它使用
std::stringstream :: put()
和std::ofstream :: put()
,并以两位十六进制整数作为参数。但是每当put()
的参数大于0x7f时,我会收到编译器警告C4309:“截断常量值”(在VC ++ 2010中)。显然,编译器期望是signed char
,而该常量超出范围。但我认为实际上没有发生任何截断。字节按预期被写入。编译器警告让我觉得我没有按照正常、接受的方式做事。我描述的情况必须是普遍存在的。有没有一种常见的方法可以避免这样的编译器警告?还是这只是一个无意义的编译器警告,应该被忽略?
我想到了两种不优雅的方法来避免它。我可以在每次调用时使用类似
mystream.put(char(0xa4))
的语法。或者,我可以使用std::basic_stringstream< unsigned char >
而不是std::stringstream
,但我认为这个技巧在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