我想做下一个: 我有一个巨大的文件(超过4GB)。我想mmap它,然后从这个128字节的mmapped区域缓冲区。我该怎么做?要使用mmap文件,请使用:
int fd = open(file_name, O_RDONLY);
void* addr = mmap(0, /*ULONG_MAX*/100000000, PROT_READ, MAP_SHARED, fd, 0);
在这些字符串之后,我想在上面描述缓冲区,但我不知道如何在网上找不到它。
其他信息:file_name是文本文件。它包含字符串
UPD:我将尝试解释:我想要mmap文件,然后从mmapped区域取128个字节(实际上是chars)并将其放入某个缓冲区。现在我使用下一个代码:
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);
但它不起作用。所以我正在寻找解决方案。
答案 0 :(得分:2)
成功mmap
后,文件的内容(最大为mmap
'd大小)在addr
指向的内存区域中可用。所以你可以做到
memcpy(buffer, addr, 128);
答案 1 :(得分:1)
哦,好吧,mmap
这不是问题,scanf
是个问题。这很简单。 Don't use scanf.要将mmap
区域中128字节的固定块复制到另一个缓冲区,您需要memcpy。
...
unsigned char *addr = mmap(0, /*ULONG_MAX*/100000000, PROT_READ, MAP_SHARED, fd, 0);
unsigned char buf[128];
...
memcpy(buf, addr + offset, 128);
这就是它的全部内容。
答案 2 :(得分: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;
}