Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一点一点地写一个文件_C++_File_Binary_Fstream - Fatal编程技术网

C++ 一点一点地写一个文件

C++ 一点一点地写一个文件,c++,file,binary,fstream,C++,File,Binary,Fstream,基本上,我正在尝试读取一个文件,每4位序列更改最后一位,然后读取更改后的文件并将其还原为原始文件。 锿 test1.bin->test2.bin->test3.bin 00011100 -> 00001101 -> 00011100 但是,虽然第二个文件正常,但第三个文件每8位更改一次,而不是每4位更改一次。这是 int main(int argc, char** argv) { ifstream f("C:\\Users\\simon\\Desktop\\test\\test.b

基本上,我正在尝试读取一个文件,每4位序列更改最后一位,然后读取更改后的文件并将其还原为原始文件。 锿 test1.bin->test2.bin->test3.bin 00011100 -> 00001101 -> 00011100 但是,虽然第二个文件正常,但第三个文件每8位更改一次,而不是每4位更改一次。这是

int main(int argc, char** argv) {   
    ifstream f("C:\\Users\\simon\\Desktop\\test\\test.bin", ios::binary | ios::in);
    ofstream f_o("C:\\Users\\simon\\Desktop\\test\\test2.bin", ios::binary | ios::out);
    char c,app;

    int rund=0;
    while (f.get(c)){
        app=c;
        for (int i = 7; i >= 0; i--){
            if(rund==3){ //it's the 4th bit, I change it
                rund=0;
                if(((c >> i) & 1) == 0)  app |= 1 << i; //if it's 0 i change to 1
                else  app |= 0 << i;
                }   
            else  rund += 1;
        }
        f_o.put(app); 
    }

    f.close();
    f_o.close();

    ifstream f2("C:\\Users\\simon\\Desktop\\test\\test2.bin", ios::binary | ios::in);
    ofstream f_o2("C:\\Users\\simon\\Desktop\\test\\test3.bin", ios::binary | ios::out);

    rund=0;
    while (f2.get(c)){
        app=c;
        for (int i = 7; i >= 0; i--){ 
            if(rund==3){
                rund=0;
                if(((c >> i) & 1) == 0)  app |= 1 << i;
                else  app |= 0 << i;
                } 
            else  rund += 1;     
        }
        f_o2.put(app); 
    }

}
intmain(intargc,char**argv){
ifstream f(“C:\\Users\\simon\\Desktop\\test\\test.bin”,ios::binary | ios::in);
流f|o(“C:\\Users\\simon\\Desktop\\test\\test2.bin”,ios::binary | ios::out);
charc,app;
int-rund=0;
而(f.get(c)){
app=c;
对于(int i=7;i>=0;i--){
如果(rund==3){//这是第4位,我会更改它
rund=0;

如果((c>>i)&1==0)app |=1KIIV已经有效地给出了(难以置信的相对简单)的解决方案,那么我将在实践中展示它并解释它的工作原理(我无法抗拒,这里的代码简化太漂亮了,我不羞于承认我与xor有一段恋情。)

新代码:

int main(int argc, char** argv) {   
    ifstream f("C:\\Users\\simon\\Desktop\\test\\test.bin", ios::binary | ios::in);
    ofstream f_o("C:\\Users\\simon\\Desktop\\test\\test2.bin", ios::binary | ios::out);
    char c;

    while (f.get(c))
        f_o.put(c ^ 0x11);

    f.close();
    f_o.close();

    ifstream f2("C:\\Users\\simon\\Desktop\\test\\test2.bin", ios::binary | ios::in);
    ofstream f_o2("C:\\Users\\simon\\Desktop\\test\\test3.bin", ios::binary | ios::out);

    while (f2.get(c))
        f_o2.put(c ^ 0x11);   
}
按位异或(XOR)

运算符^执行按位异或操作,也称为“异或”操作。它按位(按位!)工作,如下所示:

0 ^ 0 -> 0
0 ^ 1 -> 1
1 ^ 0 -> 1
1 ^ 1 -> 0
换句话说,
A^B
如果A,B中的一个且只有一个是1,则A^B
为1。因此为“独占”或

使用^

Xor是一个非常有趣的按位运算。除了其他有趣的属性外,它是需要“翻转”位状态(即,将1映射到0或0映射到1)的完美工具

假设我取
A^1
。如果A是0,那么我有
0^1=1
。如果A是1,那么我有
1^1=0
。所以你看,如果我用1异或一个位,我有效地“翻转”了这个位

OTOH,假设我取
A^0
。如果A是0,那么我有
0^0=0
。如果A是1,那么我有
1^0=1
。换句话说,
A^0=A

这是一个完美的情况…我们可以用你的字节构造一个xor位串,该位串中的每一位都将决定你字节中对应的位是否被翻转

0x11


唯一需要了解的是如何创建翻转所需位所需的值。您需要翻转第4位和第8位。因此,我们需要构造
00010001
。如果您知道十六进制,很明显这是
0x11
。如果不知道,请使用在线转换器,完成后再学习十六进制这个项目..瞧:)

KIIV已经有效地为您提供了(难以置信的相对简单)的解决方案,所以我将在实践中展示它并解释它的工作原理(我无法抗拒,这里的代码简化太漂亮了,我不羞于承认我爱上了xor。)

新代码:

int main(int argc, char** argv) {   
    ifstream f("C:\\Users\\simon\\Desktop\\test\\test.bin", ios::binary | ios::in);
    ofstream f_o("C:\\Users\\simon\\Desktop\\test\\test2.bin", ios::binary | ios::out);
    char c;

    while (f.get(c))
        f_o.put(c ^ 0x11);

    f.close();
    f_o.close();

    ifstream f2("C:\\Users\\simon\\Desktop\\test\\test2.bin", ios::binary | ios::in);
    ofstream f_o2("C:\\Users\\simon\\Desktop\\test\\test3.bin", ios::binary | ios::out);

    while (f2.get(c))
        f_o2.put(c ^ 0x11);   
}
按位异或(XOR)

运算符^执行按位异或操作,也称为“异或”操作。它按位(按位!)工作,如下所示:

0 ^ 0 -> 0
0 ^ 1 -> 1
1 ^ 0 -> 1
1 ^ 1 -> 0
换句话说,
A^B
如果A,B中的一个且只有一个是1,则A^B为1。因此为“独占”或

使用^

Xor是一个非常有趣的按位运算。除了其他有趣的属性外,它是需要“翻转”位状态(即,将1映射到0或0映射到1)的完美工具

假设我取
A^1
。如果A是0,那么我有
0^1=1
。如果A是1,那么我有
1^1=0
。所以你看,如果我用1异或一个位,我有效地“翻转”了这个位

OTOH,假设我取
A^0
。如果A是0,那么我有
0^0=0
。如果A是1,那么我有
1^0=1
。换句话说,
A^0=A

这是一个完美的情况…我们可以用你的字节构造一个xor位串,该位串中的每一位都将决定你字节中对应的位是否被翻转

0x11


唯一需要了解的是如何创建翻转所需位所需的值。您需要翻转第4位和第8位。因此,我们需要构造
00010001
。如果您知道十六进制,很明显这是
0x11
。如果不知道,请使用在线转换器,完成后再学习十六进制这个项目……< /p>把你的问题缩小到更具体的地方。这叫做“调试”。是的。用“调试”技术把问题缩小到更具体的地方。你的结果应该有4-8行(但仍然是一个完整的C++程序)。。不过,很有可能,在您需要在此处发布此MCVE之前,生成此MCVE的行为会向您揭示问题。这是目的的一部分。您为什么不使用
c2^=0x11;
?我正在帮助您;您只是还不知道。:@alternation这是一个按位异或操作,花点时间来理解它会降低成本此代码的长度为…bignum%。使用异或,您可以翻转这些位1)而不在其上循环;2)使用相同的操作,而不管该位当前是1还是0(使用异或,您可以“翻转”位的状态)。将问题缩小到更具体的范围。这称为“调试”是的。用所谓的“调试”技术把问题缩小到更具体的地方。你的结果应该有4-8行(但仍然是一个完整的C++程序)。。不过,很有可能,在您需要在此处发布此MCVE之前,生成此MCVE的行为会向您揭示问题。这是目的的一部分。您为什么不使用
c2^=0x11;
?我正在帮助您;您只是还不知道。:@alternation这是一个按位异或操作,花点时间来理解它会降低成本此代码的长度为…bignum%。使用异或,您可以翻转这些位1)而不在其上循环,2)使用相同的值