c_str不返回任何内容,但字符串不为空

问题描述

所以,我有一堂课

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文件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),则可能会使所有内容混乱,因为字节流中可能包含控制字符,并且在重置终端之前,您将再也看不到正常文本

此外,您应该大块读取数据,这比逐个字符操作要快得多