如何使用std :: ifstream读取具有宽字符串路径的二进制文件

rtu*_*ado 12 c++ fstream

我正在读取二进制文件:

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));
  ...
}
Run Code Online (Sandbox Code Playgroud)

但我意识到这不是一个真正的二进制读取.ifstream实际上读取一个字节并将其转换为宽字符.所以,如果二进制文件有内容0x112233...ff,我实际上读了0x110022003300...ff00.

这对我来说没有多大意义:首先,我只需要使用一个宽的fstream,因为文件名是非拉丁语.其次,如果我说fstream是二进制的,为什么read读取宽字符?下面的代码做我想要的.有没有办法用std fstream实现这个目标?

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

ybu*_*ill 9

当前的C++标准不提供宽字符路径.甚至wchar_t版本都会收到一个常规的const char*文件名.您已经使用了编译器扩展,因此继续使用此扩展与普通的ifstream:

std::wstring wPath(L"blah");
std::ifstream ifs(wPath.c_str(), std::ios::in | std::ios::binary)
Run Code Online (Sandbox Code Playgroud)

编辑:考虑使用utf-8字符串而不是宽字符串,并使用Boost.Nowide(尚未在boost中)打开文件.

  • @Adrian:w 版本构造函数采用 `const char *` **too**(参见标准)。wchar_t versian **是一个编译器扩展**,它适用于Microsoft C++编译器,这可能是OP使用的。我的代码在他的实现上可以正常工作,因为他**已经使用这个扩展**。因此,如果您没有真正验证或理解我所说的,请不要投反对票,您可能是错的。 (2认同)