【问题标题】:c_str() returns nothing, but string not emptyc_str() 不返回任何内容,但字符串不为空
【发布时间】:2020-10-15 06:14:20
【问题描述】:

所以,我有课

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

【问题讨论】:

  • @phuclv 你的评论应该是答案。
  • @Wander3r 完成。我上次出门,所以没时间回答
  • 您不应该期望在执行此操作时看到任何明智的结果。并非所有字节序列都可以被解释为文本,这取决于您选择的编码;当然通常它们不会是有任何意义的文本。

标签: c++ stdstring null-terminated


【解决方案1】:

一个 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 上),它可能会搞砸一切,因为字节流中可能存在控制字符,并且在您重置终端之前,您将无法再看到普通文本

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2022-08-04
    • 1970-01-01
    • 2019-10-12
    • 2021-04-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多