如何获取大(二进制)文件中字符串的偏移量?

时间:2019-01-12 14:02:01

标签: c linux fopen offset

我目前正在尝试在大文件中查找字符串的偏移量。我知道该字符串只有一次出现,但是文件中的位置可以变化。

我的第一个想法是先将文件(可能很容易达到几百兆)读取到内存中,以加快搜索速度。

但是,这很可能会导致获得内存中的偏移量,而不是实际文件的偏移量。

如何获取文件偏移量?我可以以某种方式将内存偏移量映射到文件偏移量吗?还是有直接在文件系统上执行此操作的高性能方法?

一些参考代码:

char *buffer;
long fsize = 0;

FILE *fd = fopen("data.bin", "r");

if (fd == NULL)
{
    printf("file I/O error.\n");
    return 0;
}

fseek(fd, 0, SEEK_END);
fsize = ftell(fd);
fseek (fd, 0, SEEK_SET);

buffer = malloc(fsize);

if (buffer == NULL)
{
    printf("error allocating memory.\n");
    return 0;        
}

fread(buffer, fsize, 1, fd);
fclose(fd);

// FIND STRING "MAGIC" and return FILE offset

如何从这里继续?如上所述,性能是一个重要方面。

2 个答案:

答案 0 :(得分:2)

最简单,最有效,最节省资源的方法不是将文件读入缓冲区,而是对其进行内存映射并搜索字符串,如下所示:

LocationField

这具有很大的优势,您不必关心读取文件的内存管理,操作系统将为您完成所有操作(包括缓存,预读等)。如果系统内存不足,则操作系统将自动丢弃文件的内存页面。

答案 1 :(得分:1)

使用 memmem 在缓冲区中进行搜索,( strchr 将不起作用,因为读取的文件中可能存在空字符和/或要查找的字符串)

  

但是,这很可能会导致获得内存中的偏移量,而不是实际文件的偏移量。

这是错误的,偏移量是相同的