0

我接下来要做的是:我有一个巨大的文件(超过 4GB)。我想对其进行映射,然后从这个映射的区域缓冲区中获取 128 个字节。我该怎么做?对于 mmap 文件,我使用这个:

int fd = open(file_name, O_RDONLY);
void* addr = mmap(0, /*ULONG_MAX*/100000000, PROT_READ, MAP_SHARED, fd, 0);

在这些字符串之后,我想获得上述缓冲区的描述,但我不知道怎么做,也没有在网上找到它。

附加信息:file_name 是文本文件。它包含字符串

UPD:我将尝试解释:我想对文件进行映射,然后从映射区域中取出 128 个字节(实际上是字符)并将其放入某个缓冲区。现在我使用下一个代码:

char buffer[128];
struct str* addr = mmap(0, /*ULONG_MAX*/128, PROT_READ, MAP_SHARED, fd, 0);
scanf((char*)addr, "%s", buffer);
printf("%s\n", buffer);

但它不起作用。所以我正在寻找解决方案。

4

3 回答 3

2

成功后mmap,文件的内容(最大为mmap'd 大小)在 指向的内存区域中可用addr。所以你可以做

memcpy(buffer, addr, 128);
于 2013-04-10T15:13:40.143 回答
1

哦,好吧,这不是真正的问题mmap,而是 的问题scanf。这很容易。 不要使用scanf。 要将 128 字节的固定块从一个mmap区域复制到另一个缓冲区,您需要memcpy

...
unsigned char *addr = mmap(0, /*ULONG_MAX*/100000000, PROT_READ, MAP_SHARED, fd, 0);
unsigned char buf[128];
...
memcpy(buf, addr + offset, 128);

这就是它的全部。

于 2013-04-10T15:14:02.853 回答
0

如果要打印每块 128 个字符,请执行此操作

char buf[129];

// put a nul char to ensure the string will be terminated
buf[128] = '\0';

// other stuff you've done
....

// get the file mapped to addr memory pointer
void* addr = mmap(0, /*ULONG_MAX*/100000000, PROT_READ, MAP_SHARED, fd, 0);

long i = 0

while (i < 100000000)
{
    // copy out the 128 bytes of the block
    memcpy(buf, (char *) &addr[i], 128);

    // print it out
    printf("BUF: %s\n", buf);

    // move to the next block
    i += 128;
}
于 2013-04-10T15:21:35.157 回答