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

标签 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

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

最佳答案

最简单、最有效和最节省资源的方法不是将文件读入缓冲区,而是将其内存映射并搜索字符串,然后像这样:

int fd = open(filename, O_RDONLY);
off_t length = lseek(fd, 0, SEEK_END);
void *data = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0);
void *ptr = memmem(data, length, key, keylen);
size_t offset = ptr-data;
munmap(data, length);
close(fd);

这有很大的优势,你不必关心读取文件的内存管理,操作系统会为你做这一切(包括缓存,预读等。pp.)。如果系统内存不足,操作系统将自动丢弃文件的内存页面。

关于c - 如何获取大型(二进制)文件中字符串的偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54160287/

相关文章:

c - 为什么C main函数的编码可以带参数也可以不带参数?

c - 合并排序不起作用

c - CLOCK_REALTIME CLOCK_MONOTONIC 中哪个时钟最适合计算开始时间结束时间

c - 我应该调用 fopen - fclose 每个 fwrite 操作吗

c - 如何在 printf() 语句本身中使用 pow() 函数?

c - 链表中的排序插入

linux - 当我使用 MTR 时,为什么越远的节点值越低?

linux - 使用 OpenSSL 编译时缺少 CMake 变量

c - 守护进程无法找到文件(通过相对路径指定)

检查用 fopen 打开的文件是否已经关闭