将二进制数写入文件时出现意外结果[C ++]

时间:2018-04-01 04:31:38

标签: c++ io binary output binary-data

我正在编写Linux中应该是一个非常简单的函数,它接受一个整数,将其转换为4字节的二进制字符串,并将其写入二进制文件。

功能:

void writeToBinaryFile(int number){
    remove("path/fileToWriteTo.img");  //remove outdated version of file

    ofstream output("path/fileToWriteTo.img", ios::binary);

    string binaryString = bitset<32>(number).to_string();
    cout << "BINARY DATA IS " << binaryString << endl; 
    //This looks perfect, an example entry of 81 results in an output of
    //BINARY DATA IS 00000000000000000000000001010001

    output.seekp(0);
    output.write(binaryString.c_str(), 4);  //write these 4 bytes into binary file
    output.close();
}

此函数编译并运行没有问题,但是,当我hexdump fileToWriteTo.img的内容时,结果是错误的。运行writeToBinaryFile(81)后的正确hexdump应为0000 0051,作为示例。

然而,ACTUAL hexdump是3030 3030,无论我传递给writeToBinaryFile()的整数是什么,它仍然存在。这种尝试将字符串写入二进制格式的文件时,我觉得我有一些相当微不足道的东西,但是目前对于正在发生的事情感到茫然。

1 个答案:

答案 0 :(得分:2)

您意识到binaryString"00000000000000000000000001010001"

使用时

output.write(binaryString.c_str(), 4);

您正在编写字符串的前4个字符,这些字符都是'0'个。可能让你困惑的是你期望看到数字为零,但你要求程序写的是字符'0''0'的ASCII编码值为十进制48,即0x30。这就是您在文件中看到的内容 - 四个0x30

如果您想将数字写入二进制文件,您可以使用以下内容,而无需跳过bitset箍。

void writeToBinaryFile(int number)
{
    ofstream output("path/fileToWriteTo.img", ios::binary);
    output.write(reinterpret_cast<char cons*>(&number), sizeof(number));
}

根本不需要函数中的其他行。