8

现在我有一个包含许多数据的文件。而且我知道我需要的数据从位置 (long)x 开始,并且具有给定的大小 sizeof(y) 我怎样才能获得这些数据?

4

3 回答 3

12

使用seek方法:

ifstream strm;
strm.open ( ... );
strm.seekg (x);
strm.read (buffer, y);
于 2009-06-26T13:44:28.130 回答
3

您应该使用 fseek() 将文件中的“当前位置”更改为所需的偏移量。因此,如果“f”是您的 FILE* 变量并且偏移量是偏移量,那么调用应该是这样的(以我的泄漏内存为模):

fseek(f, offset, SEEK_SET);
于 2009-06-26T13:42:49.613 回答
2

除了上面提到的通常的查找和读取技术之外,您还可以使用类似mmap()的方法将文件映射到您的进程空间并直接访问数据。

例如,给定以下数据文件“foo.dat”:

one two three

以下代码将使用基于mmap()的方法打印前四个字节之后的所有文本:

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include <iostream>

int main()
{
  int result = -1;

  int const fd = open("foo.dat", O_RDONLY);
  struct stat s;

  if (fd != -1 && fstat(fd, &s) == 0)
  {
    void * const addr = mmap(0, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
    if (addr != MAP_FAILED)
    {
       char const * const text = static_cast<char *>(addr);

       // Print all text after the first 4 bytes.
       std::cout << text + 4 << std::endl;
       munmap(addr, s.st_size);
       result = 0;
    }

    close(fd);
  }

  return result;
}

您甚至可以使用这种方法直接写入文件(如有必要,请记住msync() )。

Boost 和 ACE 等库为 mmap()(以及等效的 Windows 函数)提供了很好的 C++ 封装。

这种方法对于小文件来说可能是矫枉过正,但对于大文件来说可能是巨大的胜利。像往常一样,分析您的代码以确定哪种方法最好。

于 2009-06-26T18:02:17.860 回答