c_str() returns 什么都没有,但字符串不为空

c_str() returns nothing, but string not empty

所以,我有一个 class

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();
}

当我输出字符串时,一切正常。它打印凌乱,但有些东西。但是当我在 buffer 上调用 c_str() 并尝试打印时,它什么也没打印。

一个 ICO 文件 starts with 2 zero bytes 所以 buffer.c_str() 指向一个空字符串。结果打印它什么也没显示。如果您打印字节值,您会立即明白为什么

for (const auto c: buffer)
    std::cout << std::setfill('0') << std::setw(2) << std::hex << +c << ' ';

OTOH std::string can contain embedded nulls,打印它会将整个文件输出到输出流

但是为什么首先将二进制文件打印为文本?如果您使用的是 ANSI 终端(例如 Linux),它可能会搞乱所有内容,因为字节流中可能有控制字符,并且在您重置终端之前您再也看不到正常文本[=15] =]

此外,你应该读取大块数据,这比操作要快得多 char-by-char