Подтвердить что ты не робот

Как использовать std:: ifstream для чтения в двоичном файле с широким строковым путем

Я читаю двоичный файл как:

const size_t stBuffer = 256;
char buffer[stBuffer];
std::wstring wPath(L"blah");
std::wifstream ifs(wPath.c_str(), std::wifstream::in | std::wifstream::binary)
while (ifs.good())
{
  ifs.read(buffer, sizeof(buffer));
  ...
}

Но я понимаю, что это не истинное двоичное чтение. Ifstream фактически считывает байт и преобразует его в широкий char. Поэтому, если у двоичного файла есть контент 0x112233...ff, я действительно читаю 0x110022003300...ff00.

Это не имеет большого значения для меня: во-первых, мне нужно использовать только большой поток, потому что имя файла не является латинским. Во-вторых, если я говорю, что fstream является двоичным, почему read читает широкие символы? Следующий код делает то, что я хочу. Есть ли способ достичь этого, используя std fstream?

FILE* ifs = _wfopen(L"blah", L"rb");
while (!feof(ifs))
{
  size_t numBytesRead = fread(buffer, 1, sizeof(buffer), ifs);
  ...
}
4b9b3361

Ответ 1

В текущем стандарте С++ не предусмотрены широкие пути char. Даже версия wchar_t получает регулярное const char * имя файла. Вы уже использовали расширение компилятора, поэтому продолжайте использовать это расширение с нормальным ifstream:

std::wstring wPath(L"blah");
std::ifstream ifs(wPath.c_str(), std::ios::in | std::ios::binary)

EDIT: рассмотрите используя строки utf-8 вместо широких строк и используйте Boost.Nowide (еще не в boost) для открытия файлов.