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

问题描述 投票:0回答:1

所以,我有课

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
并尝试打印时,它什么也打印不出来。

c++ stdstring null-terminated
1个回答
3
投票

ICO 文件以 2 个零字节开始,因此

buffer.c_str()
指向空字符串。结果打印出来什么也没显示。如果您打印字节值,您将立即明白原因

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

OTOH

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

但是为什么首先要将二进制文件打印为文本?这是一个非常糟糕的主意,可能会完全搞乱终端,因为字节流中可能存在控制字符,并且在您重置终端之前您将无法再看到正常文本。此外,您应该读取大块数据,这比逐个字符操作要快得多

© www.soinside.com 2019 - 2024. All rights reserved.