【问题标题】:Why does writing to binary file writes one byte from no where为什么写入二进制文件会从任何地方写入一个字节
【发布时间】:2017-04-27 13:23:10
【问题描述】:

我有一个将字节写入二进制文件的类

class BITWRITER{
public:
ofstream OFD;
char var;
int x;
BITWRITER(char* pot){
    OFD.open(pot);
    x = 0;
    var  =0;

}
void WRITE(bool b){
    var ^= (-b^var)&(1 << x);
    x++;
    if(x == 7){
        OFD.write(&var, 1);
        x = 0;
        var = 0;
    }

}
}

还有我的示例代码:

string bitCode = "0001010";
bool BitIsOne = false;
BITWRITER *write= new BITWRITER("out.bin");
for(int i =  bitCode.length()-1 ; i >= 0; i--){
    if(bitCode[i] == '1')
            BitIsOne=true;
        else
            BitIsOne=false;
    write->WRITE(BitIsOne);
}
delete write;

我不明白的是,为什么当我运行这个确切的代码时,当我接下来读取这个文件而不是二进制文件中只有一个字节时,我有两个字节。

在这个例子中,输出应该是 “1010” 但在此之前以某种方式创建了一个随机字节(“1101”)。

任何想法都将不胜感激!

【问题讨论】:

  • var 是什么类型,sizeof(var) 是什么?
  • var 是 char 。和普通字符一样大小是 1 个字节。
  • var 和 x 的初始值是多少?
  • 更新了上面的类。我注意到这只是一种情况,当我想写某些位时。查看 ASCII 表,“\n”是否需要“\r”或其他东西才能自动生成?因为 1010 是 "\n" 而 1101 是 ASCII 中的 "\r"。

标签: c++ binary bin


【解决方案1】:

二进制10100x0a,这是一个换行符。您在打开文件时没有指定它应该以二进制模式打开。

在 Windows 上,当您将换行符写入文本模式文件时,它会将其转换为 cr/lf 序列。 cr 返回是 0x0d,它是二进制 1101

指定文件应该以二进制模式打开:

OFD.open(pot, ios::binary);

【讨论】:

  • 你是个救星,应该在 3 小时前问你。 !
  • 好吧,我在写答案前 3 小时睡着了! :) 从您上面的评论来看,您似乎已经步入正轨,可以自己解决。
猜你喜欢
  • 1970-01-01
  • 2015-05-15
  • 2021-05-17
  • 2011-11-28
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
相关资源
最近更新 更多