【问题标题】:seekg, relative or absolute position?寻找,相对或绝对位置?
【发布时间】:2013-07-06 18:04:25
【问题描述】:

我需要从文件中读取一个数组。数组在文件中不是连续排序的,必须跳转“偏移”字节才能获取下一个元素。 假设我读取了一个非常大的文件,那么效率更高。

1) 使用增量相对位置。
2) 使用绝对位置。

选项 1:

int var[N];
seekg(0);
for (int i=0; i<N; i++) {
  file.read( (char*) var+i, sizeof(int))
  seekg(offset,ios_base::cur);
}

选项2:

int var[N];
for (int i=0; i<N; i++) {
  file.seekg(offset*i);
  read( (char*) var+i, sizeof(int))
}

【问题讨论】:

    标签: c++ seekg


    【解决方案1】:

    read 已经提前了位置,所以你不需要在循环内寻找。此外,数组在内存中是连续布局的,所以你可以说:

    std::vector<int> var(N);
    
    auto res = file.read(reinterpret_cast<char*>(var.data()), sizeof(int) * var.size());
    

    请务必在之后检查 resfile 的值:

    if (!file || res != sizeof(int) * var.size())
    {
         // an error occurred
    }
    

    如果您从文件的随机部分读取,那么您的查找方式没有区别(文件本质上是“随机访问”)。但请务必在每次读取后运行上述测试以捕获错误。

    【讨论】:

    • 并回答原始问题:必须始终将相对位置转换为绝对位置(通过简单的添加),因此使用相对定位与绝对定位之间没有可测量的差异。
    • 改写我的问题:文件中的数组不是连续排序的
    • @Barak:好的,在这种情况下你可以寻找,这完全没有区别。请记住,当您相对搜索时,read 已经使光标前进,并确保在每次提取后检查错误
    【解决方案2】:

    我 99.9% 确信它根本不会产生任何影响(除了 offset 的正确性需要正确调整,因为您在相对情况下已将 sizeof(int) 字节向前移动,而不是在绝对情况下。在这两种情况下,您都会进行搜索,这将移动文件中的当前位置。文件系统中处理该问题的实际代码最终将通过从当前位置计算来移动到绝对位置在ios_base::cur 的情况下)。

    如果知道哪个更好对您来说真的很重要,那么请对这两个选项进行基准测试。但我很确定它在文件系统中的实际查找函数中完全没有区别。它只是一个大整数(可能是 64 位),用于跟踪您接下来要读取(或写入)文件的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多