寻求,相对或绝对的位置?

时间:2013-07-06 18:04:25

标签: c++ seekg

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

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

2 个答案:

答案 0 :(得分:2)

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
}

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

答案 1 :(得分:0)

我99.9%肯定它根本没有任何区别(除了offset方面的正确性需要正确调整,因为你已经将sizeof(int)个字节向前移动了相对情况,而不是绝对情况。在这两种情况下,你都会进行搜索,它将移动文件中的当前位置。处理文件系统的实际代码最终会通过计算它移动到绝对位置从ios_base::cur的情况中的当前一个。

如果您知道哪个更好是非常重要,那么请对这两个选项进行基准测试。但我很确定它在文件系统中的实际搜索功能中完全没有任何区别。它只是一个大整数(可能是64位),可以跟踪下一个正在读取(或写入)文件的位置。