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
所以,我有一个 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