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 и пытаюсь распечатать, он ничего не печатает.


person shArky    schedule 15.10.2020    source источник
comment
@phuclv ваш комментарий должен был быть ответом.   -  person Wander3r    schedule 15.10.2020
comment
@Wander3r Готово. Я собирался в прошлый раз, поэтому у меня не было времени на ответ   -  person phuclv    schedule 15.10.2020
comment
Не стоит ожидать увидеть что-то толковое при этом. Не все последовательности байтов вообще могут быть интерпретированы как текст, в зависимости от выбранной вами кодировки; и уж точно в целом они не будут текстом, имеющим какое-либо значение.   -  person Karl Knechtel    schedule 15.10.2020


Ответы (1)


Файл ICO начинается с 2 нулевых байтов, поэтому buffer.c_str() указывает на пустую строку. . В результате печать ничего не показывает. Если вы напечатаете значения байтов, вы сразу поймете, почему

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

OTOH std::string может содержать встроенные нули, при печати он выводит весь файл в выходной поток

Но почему вы печатаете двоичный файл как текст? Если вы используете терминал ANSI (например, в Linux), это может все испортить, потому что в потоке байтов могут быть управляющие символы, и вы больше не сможете видеть нормальный текст, пока не перезагрузите терминал.

Кроме того, вместо этого вы должны читать данные большими блоками, что намного быстрее, чем работа с символом за символом.

person phuclv    schedule 15.10.2020