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

发布于 2024-10-25 09:26:36 字数 702 浏览 2 评论 0原文

我正在读取二进制文件:

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);
  ...
}

I am reading a binary file as:

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));
  ...
}

But I am realizing this is not a true binary read. The ifstream actually reads a byte and converts it to a wide char. So if the binary file has the content 0x112233...ff, I actually read 0x110022003300...ff00.

This doesn't make much sense to me: first, I only need to use a wide fstream because the file name is non Latin. Second, if I say the fstream is binary, why does read read wide chars? The code below does what I want. Is there a way to achieve that using std fstreams?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挽容 2024-11-01 09:26:37

当前的 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)来打开文件。

编辑: Boost.Nowide 在 boost 中被接受。此外,Windows 10 添加了对 UTF- 的支持8 位于其窄字符串 API 中,可以通过清单启用。这使得所有宽字符接口几乎不可移植且冗余。

The current C++ standard doesn't provide wide char paths. Even the wchar_t version receives a regular const char* filename. You already used a compiler extension, so continue using this extension with a normal ifstream:

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

EDIT: consider using utf-8 strings instead of wide strings and use Boost.Nowide (not yet in boost) to open files.

EDIT: Boost.Nowide was accepted in boost. Also Windows 10 added support for UTF-8 in its narrow-string API, which can be enabled through a manifest. This makes all the wide-char interfaces pretty much unportable and redundant.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文