我正在读取二进制文件:
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,因为文件名是非拉丁语。其次,如果我说fstream是二进制的,为什么read
读取宽字符?下面的代码做我想要的。有没有办法用std fstreams实现这个目标?
FILE* ifs = _wfopen(L"blah", L"rb");
while (!feof(ifs))
{
size_t numBytesRead = fread(buffer, 1, sizeof(buffer), ifs);
...
}
答案 0 :(得分:9)
当前的C ++标准不提供宽字符路径。甚至wchar_t版本都会收到一个常规的const char *文件名。您已经使用了编译器扩展,因此请继续使用此扩展名与正常的ifstream:
std::wstring wPath(L"blah");
std::ifstream ifs(wPath.c_str(), std::ios::in | std::ios::binary)
编辑:考虑使用using utf-8 strings而不是宽字符串,并使用Boost.Nowide(尚未提升)来打开文件。