首页 >后端开发 >C++ >如何优化将二进制文件读取到无符号字符向量中?

如何优化将二进制文件读取到无符号字符向量中?

Linda Hamilton
Linda Hamilton原创
2024-11-02 03:37:02271浏览

How to Optimize Reading Binary Files into a Vector of Unsigned Chars?

二进制文件读取优化

要以最佳方式将二进制文件读取到无符号字符向量中,请考虑以下策略:

方法 1:自定义向量构建

<code class="cpp">std::vector<BYTE> readFile(const char* filename)
{
    std::ifstream file(filename, std::ios::binary);
    std::streampos fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
    std::vector<BYTE> fileData(fileSize);
    file.read((char*) &fileData[0], fileSize);
    return fileData;
}</code>

此方法根据文件大小显式创建具有正确大小的向量。但是,它将向量的数据转换为 char*,这是不可取的。

方法 2:Istreambuf 迭代器

<code class="cpp">std::vector<BYTE> readFile(const char* filename)
{
    std::ifstream file(filename, std::ios::binary);
    return std::vector<BYTE>((std::istreambuf_iterator<char>(file)),
                              std::istreambuf_iterator<char>());
}</code>

此方法使用将数据读入的迭代器内部有一个字符缓冲区。虽然它更短,但尽管读取无符号字符,它仍然需要字符迭代器。

方法 3:基本 Ifstream 专业化

<code class="cpp">std::vector<BYTE> readFile(const char* filename)
{
    std::basic_ifstream<BYTE> file(filename, std::ios::binary);
    return std::vector<BYTE>((std::istreambuf_iterator<BYTE>(file)),
                              std::istreambuf_iterator<BYTE>());
}</code>

此方法使用专门的输入文件流对于无符号字符。但是,它可能并不适合所有情况。

优化

  • 预留容量:为向量预分配内存可以提高性能。
  • 禁用换行符抑制: 二进制模式下的 ios::skipws 可能会导致性能问题;使用 unsetf 禁用它。
  • istream_iterator 与 std::copy: std::copy 可以避免与运算符 >> 相关的开销。

注意事项

  • Istreambuf 迭代器可能因其简单性而受到青睐,但自定义迭代器可能会提供更好的性能。
  • “最佳”方法取决于应用程序和正在读取的数据。

以上是如何优化将二进制文件读取到无符号字符向量中?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn