如何在C中从mmap区域获得固定大小的缓冲区?

如何在C中从mmap区域获得固定大小的缓冲区?,c,io,mmap,C,Io,Mmap,我想做下一步: 我有一个巨大的文件(超过4GB)。我想mmap它,然后从这个mmap区域获取128字节的缓冲区。我怎么做?要创建mmap文件,我使用以下方法: int fd = open(file_name, O_RDONLY); void* addr = mmap(0, /*ULONG_MAX*/100000000, PROT_READ, MAP_SHARED, fd, 0); 在这些字符串之后,我想得到上面描述的缓冲区,但我不知道如何,也没有在web上找到它 附加信息:文件名为文本文件。它

我想做下一步: 我有一个巨大的文件(超过4GB)。我想mmap它,然后从这个mmap区域获取128字节的缓冲区。我怎么做?要创建mmap文件,我使用以下方法:

int fd = open(file_name, O_RDONLY);
void* addr = mmap(0, /*ULONG_MAX*/100000000, PROT_READ, MAP_SHARED, fd, 0);
在这些字符串之后,我想得到上面描述的缓冲区,但我不知道如何,也没有在web上找到它

附加信息:文件名为文本文件。它包含字符串

UPD:我试着解释一下:我想要mmap文件,然后从mmap区域获取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);

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

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

memcpy(buffer, addr, 128);

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

memcpy(buffer, addr, 128);

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


这就是它的全部。

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


这就是它的全部内容。

如果要打印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;
}
charbuf[129];
//放置nul字符以确保字符串将被终止
buf[128]='\0';
//你做过的其他事情
....
//获取映射到addr内存指针的文件
void*addr=mmap(0,/*ULONG_MAX*/100000000,保护读取,映射共享,fd,0);
长i=0
而(i<100000000)
{
//复制出块的128字节
memcpy(buf,(char*)和addr[i],128);
//打印出来
printf(“基本单位:%s\n”,基本单位);
//移到下一个街区
i+=128;
}

如果要打印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;
}
charbuf[129];
//放置nul字符以确保字符串将被终止
buf[128]='\0';
//你做过的其他事情
....
//获取映射到addr内存指针的文件
void*addr=mmap(0,/*ULONG_MAX*/100000000,保护读取,映射共享,fd,0);
长i=0
而(i<100000000)
{
//复制出块的128字节
memcpy(buf,(char*)和addr[i],128);
//打印出来
printf(“基本单位:%s\n”,基本单位);
//移到下一个街区
i+=128;
}

在这些字符串之后,我想得到上面描述的缓冲区
语法错误。请详细说明/解释……我不明白你所说的“从128字节的映射区域缓冲区中提取”是什么意思。你能展示一下你已经为此编写的任何代码吗,因为这是不起作用的部分?作为记录,我没有看到
mmap
调用本身有任何明显的错误,除了一些系统可能反对100000000不是
sysconf(\u SC\u PAGESIZE)
的倍数。我不明白。。。你需要该文件的前128字节吗?@DavideBerra,是的。然后我需要第二个128字节。依此类推,在这些字符串之后,我想得到上面描述的缓冲区语法错误。请详细说明/解释……我不明白你所说的“从128字节的映射区域缓冲区中提取”是什么意思。你能展示一下你已经为此编写的任何代码吗,因为这是不起作用的部分?作为记录,我没有看到
mmap
调用本身有任何明显的错误,除了一些系统可能反对100000000不是
sysconf(\u SC\u PAGESIZE)
的倍数。我不明白。。。你需要该文件的前128字节吗?@DavideBerra,是的。然后我需要第二个128字节。因此,从技术上讲,不是文件的全部内容,而是文件的前100000000字节。(100000000 ≈ 2^{26}绝对小于“超过4GB”)。@nneonneo谢谢。它起作用了。您知道从mmapped区域读取字符串的解决方案吗?使用
strncpy
或其他方法。从技术上讲,不是文件的全部内容,而是文件的前100000000字节。(100000000 ≈ 2^{26}绝对小于“超过4GB”)。@nneonneo谢谢。它起作用了。您知道从mmapped区域读取字符串的解决方案吗?使用
strncpy
或其他方法。