c语言 文件截断,c – 是否有一种正统的方法来避免编译器警告C4309 – “二进制文件输出的”常数值的截断“?...

我的程序执行将二进制数据写入文件,符合某种非文本文件格式的常见任务.由于我正在写的数据不是现有的块,而是在运行时逐字节地放在一起,我使用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&gt,但是我不认为这个技巧可以与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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值