fwrite 字符串中的二进制数据
fwrite binary data from a string
我想创建一个文件并将 "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
你发现这段代码有问题吗?
fwrite(&binary, 1, 1, f);
您将 std::string
的指针传递给 fwrite
,这很糟糕。
您需要通过调用 c_str()
:
来获取指向字符串内部缓冲区的指针
fwrite(binary.c_str(), 1, 1, f);
这是不使用 C 文件句柄的另一个原因,fwrite
的第一个参数是 const void*
,这就是为什么您的编译器一开始没有给您错误。
当你想做一个比特流时,字符串是坏的...
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;
}
我想创建一个文件并将 "A" 写入其中(ascii 是 65 == 01000001)。奇怪的是,无论std::string binary
是什么值,myfile.txt
.
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
你发现这段代码有问题吗?
fwrite(&binary, 1, 1, f);
您将 std::string
的指针传递给 fwrite
,这很糟糕。
您需要通过调用 c_str()
:
fwrite(binary.c_str(), 1, 1, f);
这是不使用 C 文件句柄的另一个原因,fwrite
的第一个参数是 const void*
,这就是为什么您的编译器一开始没有给您错误。
当你想做一个比特流时,字符串是坏的...
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;
}