1

所以,我有一堂课

class MySuperClass {
public:
 std::string buffer;
};

并想打印bufferstd::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尝试打印时,它什么也没打印。

4

1 回答 1

3

ICO 文件以 2 个零字节开始,因此buffer.c_str()指向一个空字符串。结果打印它什么也没显示。如果您打印字节值,您将立即看到原因

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

OTOHstd::string 可以包含嵌入的空值,打印它将整个文件输出到输出流

但是为什么你首先将二进制文件打印为文本呢?如果您使用的是 ANSI 终端(例如在 Linux 上),它可能会搞砸一切,因为字节流中可能存在控制字符,并且在您重置终端之前,您将无法再看到普通文本

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

于 2020-10-15T08:12:42.887 回答