fwrite来自字符串的二进制数据

时间:2017-01-13 12:36:00

标签: c++ fwrite

我想创建一个文件并在其中写入“A”(ascii是65 == 01000001)。奇怪的是,无论std::string binary的价值如何,总是在myfile.txt中写下字母P.

    std::string binary = "01000001";
    std::string file = "myfile.txt";
    FILE* f;
    f = fopen(file.c_str(), "wb");      
    fwrite(&binary, 1, 1, f);     
    fclose(f);

执行此代码后,我使用命令xxd -b myfile读取二进制数据,我得到了这个:

  

00000000:01010000

您是否发现此代码存在问题?

2 个答案:

答案 0 :(得分:4)

fwrite(&binary, 1, 1, f);

您将std::string的指针传递给fwrite,这很糟糕。

您需要通过调用c_str()来获取指向字符串内部缓冲区的指针:

fwrite(binary.c_str(), 1, 1, f);  

这是不使用C文件句柄的另一个原因,fwrite的第一个参数是const void*,这就是为什么你的编译器首先没有给你一个错误。

答案 1 :(得分:1)

当您想要进行比特流时,字符串很糟糕......

int8_t binary = 0b01000001;
std::string file = "myfile.txt";
FILE* f;
f = fopen(file.c_str(), "wb");      
fwrite(&binary, 1, 1, f);     
fclose(f);

但是当你使用C ++时,你真的不需要使用C库

#include <fstream>

int main()
{
    std::fstream f;
    std::string file = "myfile.txt";
    f.open(file, std::fstream::out | std::fstream::binary);
    int8_t binary = 0b01000001; // int8_t is required to only write 8 bits/1 byte
    f << binary;
    f.close();
    return 0;
}