Как сохранить шестнадцатеричное представление двоичного файла в std::string?

Я использовал это решение (С++) Чтение файла .dat как шестнадцатеричный, используя ifstream, но вместо того, чтобы печатать его в std::cout, я хотел бы сохранить шестнадцатеричное представление двоичного файла в std::string

#include <fstream>
#include <sstream>
#include <iostream>
#include <string>
#include <iomanip>

int main(int argc, char** argv)
{
  unsigned char x; 

  std::ifstream fin(argv[1], std::ios::binary);
  std::stringstream buffer;

  fin >> std::noskipws;
  while (!fin.eof()) {
    fin >> x ; 
    buffer << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(x);
  }
  std::cout << buffer;
}

Печать в cout работает, но сохранение этого содержимого в buffer, а затем попытка распечатать его в cout печатает мусор.

Что мне не хватает?


person Patryk    schedule 04.01.2016    source источник
comment
Не имеет отношения к вашей проблеме, но почти во всех случаях (включая этот) выполнение while (!fin.feof()) не будет работать так, как вы ожидаете. Вместо этого сделайте while (fin >> x).   -  person Some programmer dude    schedule 04.01.2016
comment
Примечание: eof считается вредным.   -  person molbdnilo    schedule 04.01.2016


Ответы (1)


У вас нет std::string; у вас есть std::stringstream. И вы не можете «распечатать» строковый поток, но вы можете получить std::string представление его буфера, используя функцию-член str().

Вы, вероятно, имели в виду, тогда:

std::cout << buffer.str();

Есть более чистые способы сделать это, но приведенное выше поможет вам начать.

Кроме того, ваша петля неверна. Вы слишком рано проверяете EOF.

person Lightness Races in Orbit    schedule 04.01.2016
comment
Конечно... Спасибо за помощь. Это сработало. Что вы имеете в виду под слишком ранней проверкой EOF? Поможет ли изменение цикла do, while? - person Patryk; 04.01.2016
comment
@Patryk: На самом деле может. - person Lightness Races in Orbit; 04.01.2016