Как использовать std :: ifstream для чтения в двоичном файле с широким строковым путем - PullRequest
12 голосов
/ 21 марта 2011

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

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 читает байт и преобразует его в широкий символ.Так что, если бинарный файл имеет содержимое 0x112233...ff, я на самом деле читаю 0x110022003300...ff00.

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

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

1 Ответ

9 голосов
/ 21 марта 2011

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

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

РЕДАКТИРОВАТЬ: рассмотреть с использованием строк utf-8 вместо широких строк и использовать Boost.Nowide (пока не в boost) для открытия файлов.

...