C++ 为什么写入二进制文件会从零开始写入一个字节

C++ 为什么写入二进制文件会从零开始写入一个字节,c++,binary,bin,C++,Binary,Bin,我有一个将字节写入二进制文件的类 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(&v

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

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;
    }

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

在本例中,输出应为 "1010" 但在此之前,以某种方式创建了一个随机字节(“1101”)


任何想法都将不胜感激

二进制
1010
0x0a
,它是一个换行符。您正在打开该文件,但未指定该文件应以二进制模式打开

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

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

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

什么是
var
的类型,什么是
sizeof(var)
?var是char。和普通字符一样大小是1字节。var和x的初始值是多少?更新了上面的类。我注意到这只是一种情况,当我想写某些位时。在ASCII表中查看“\n”是否需要“\r”或它自动生成的内容?因为1010在ASCII中是“\n”,1101在ASCII中是“\r”。你是个救生员,应该在3小时前问你!嗯,我在写答案前3个小时就睡着了!:)从你上面的评论来看,看起来你自己已经走上了解决问题的轨道。
OFD.open(pot, ios::binary);