现在我有一个包含许多数据的文件。 而且我知道我需要的数据从位置(长)x开始并且具有给定的大小sizeof(y) 我怎样才能获得这些数据?
答案 0 :(得分:11)
使用seek
方法:
ifstream strm;
strm.open ( ... );
strm.seekg (x);
strm.read (buffer, y);
答案 1 :(得分:3)
您应该使用fseek()将文件中的“当前位置”更改为所需的偏移量。所以,如果“f”是你的FILE *变量而offset是偏移量,那么这就是调用的样子(以模块化我的漏储存储器):
fseek(f, offset, SEEK_SET);
答案 2 :(得分: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 ++封装。
对于小文件来说,这种方法可能有些过分,但对于大文件来说,这可能是一个巨大的胜利。像往常一样,分析您的代码以确定哪种方法最佳。