【问题标题】:Large binary file copy with standard C++ [duplicate]使用标准 C++ 复制大型二进制文件 [重复]
【发布时间】:2012-09-28 07:27:19
【问题描述】:

可能重复:
Copy a file in an sane, safe and efficient way

我搜索过类似的主题,但找不到大型二进制文件的答案。考虑到我有非常大的二进制文件(如每个 ~10 或 ~100 GB),我如何使用标准 C++(无 POSIX 函数)使用以下函数复制它们:

bool copy(const std::string& oldName, const std::string& newName)
{
    /* SOMETHING */
}

编辑: 以下实现可以吗? (改编自cmets中的链接)

bool copy(const std::string& oldName, const std::string& newName)
{
    bool ok = false;
    std::ifstream oldStream(oldName.c_str(), std::ios::binary);
    std::ofstream newStream(newName.c_str(), std::ios::binary);
    if (oldStream.is_open() && newStream.is_open()) {
        newStream << oldStream.rdbuf();
        ok = (oldStream.good() && newStream.good());
    }
    return ok;
}

【问题讨论】:

  • 复制文件意味着使用文件系统。因此,最有效的方法是调用与文件系统交互的适当操作系统例程。
  • 运算符'
  • @Vincent,应该是在您使用std::ios::binary 时。不幸的是,它在许多实现上也很慢。
  • @Vincent:如果您的意思是以 std::ios::binary 模式打开的文件。好的。打开的模式对其使用影响不大见(stackoverflow.com/questions/12766636/…)

标签: c++ file stream binary copy


【解决方案1】:

您可以使用std::fopen、std::fread、std::fwrite 和std::fclose,它们都是标准 C++ 库的一部分(#include &lt;cstdio&gt;,非常便携)并且不会将二进制数据弄乱只要您不对fopen 使用"t" 说明符。

如果您选择合适的缓冲区大小(例如 1 MB),它甚至会相当快,让您进入顺序 I/O 性能领域。

【讨论】:

    猜你喜欢
    • 2015-10-04
    • 2012-08-19
    • 2011-03-13
    • 2015-11-29
    • 2022-06-23
    • 2015-11-23
    • 2012-10-01
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多