所以,我有课
class MySuperClass {
public:
std::string buffer;
};
并且想要将
buffer
打印到 std::cout
。
这是一些关于从文件填充字符串的代码:
MySuperClass msc;
std::fstream file("./favicon.ico", std::fstream::in | std::fstream::binary);
if (file.is_open()) {
std::stringstream ss;
while (!file.eof())
ss << static_cast<uint8_t>(file.get());
msc.buffer.assign(ss.str());
file.close();
}
当我输出字符串时,一切正常。它打印得很乱,但是有一些东西。但是当我在
c_str()
上调用 buffer
并尝试打印时,它什么也打印不出来。
ICO 文件以 2 个零字节开始,因此
buffer.c_str()
指向空字符串。结果打印出来什么也没显示。如果您打印字节值,您将立即明白原因
for (const auto c: buffer)
std::cout << std::setfill('0') << std::setw(2) << std::hex << +c << ' ';
OTOH
std::string
可以包含嵌入的空值,打印它会将整个文件输出到输出流
但是为什么首先要将二进制文件打印为文本?这是一个非常糟糕的主意,可能会完全搞乱终端,因为字节流中可能存在控制字符,并且在您重置终端之前您将无法再看到正常文本。此外,您应该读取大块数据,这比逐个字符操作要快得多
看