C/UNIX mmap int数组

C/UNIX mmap int数组,c,unix,int,mmap,C,Unix,Int,Mmap,是否可以mmap将充满整数的文件作为整数数组?我是说像这样的东西(不起作用) 给定文件tmp.in 1 2 15 1258 与此类似的代码 int fd; if ((fd = open("tmp.in", O_RDWR, 0666)) == -1) { err(1, "open"); } size_t size = 4 * sizeof(int); int * map = (int *) mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_S

是否可以
mmap
将充满整数的文件作为整数数组?我是说像这样的东西(不起作用)

给定文件
tmp.in

1 2 15 1258
与此类似的代码

int fd;
if ((fd = open("tmp.in", O_RDWR, 0666)) == -1)  {
    err(1, "open");
}

size_t size =  4 * sizeof(int);
int * map = (int *) mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
我想打个电话

printf("%d\n", map[2]+1);
预期结果

16
我发现char映射使用
sscanf
来解析整数,但我需要在数组中包含数字(并且可能在
munmap
时更改它们并保存它们)。仅使用POSIX函数和系统调用

我在这里找到了一些东西,但我需要文件保持可读性(所以没有二进制表示)。使用strtok和atoi迫使我使用另一个数组,不是吗?最后,我需要将数据复制回
map


感谢您的帮助:)

否,
mmap
自动将文件映射到您的地址空间

这意味着文本文件将被映射为字符,而不是整数数组。换句话说,
1 2 15 1258
将被映射(假设ASCII编码和UNIX行结束)为:


如果您想在文件中保留文本数据,而在内存中保留二进制数据,则必须自己进行转换(双向)。

否,
mmap
自动将文件映射到您的地址空间

这意味着文本文件将被映射为字符,而不是整数数组。换句话说,
1 2 15 1258
将被映射(假设ASCII编码和UNIX行结束)为:


如果您想在文件中保留文本数据,但在内存中保留二进制数据,则必须自己进行转换(两个方向)。

假设输入文件是文本文件(而不是二进制文件,可以包含整数或写入其中的任何二进制数据),您的文件将映射为长度等于文件大小的字符串

一旦该字符串映射到内存中,就可以使用指针访问各个字符

我希望能够调用printf(“%d\n”,map[2]+1)

地图[2]+1

这将只是增加字符的ASCII值

根据我的理解,您希望将文件映射到内存中,并像整数一样更改值。 这是不可能的,只要文件是文本文件

我建议您将文件映射到内存中,读取字符,进行解析(在本例中查找空格)并更改字符值

下面是一个示例代码:

[root@mohitsinghmemoryMap]#cat sample.txt

12345

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义文件路径“/sample.txt”
#定义NUMINTS(5)
#定义文件大小(NUMINTS*sizeof(int))
int main(int argc,char*argv[])
{
int i;
int-fd;
char*map;/*mmapped字符数组*/
fd=打开(文件路径,O_RDWR);
如果(fd==-1){
perror(“打开文件读取时出错”);
退出(退出失败);
}
map=mmap(0,文件大小,PROT_READ | PROT_WRITE,map_SHARED,fd,0);
if(map==map\u失败){
关闭(fd);
perror(“映射文件时出错”);
退出(退出失败);
}
/*从mmap中逐字符读取文件
**/

对于(i=0;i假设输入文件是文本文件(不是可以包含整数的二进制文件或写入其中的任何二进制数据),文件将映射为长度等于文件大小的字符串

一旦该字符串映射到内存中,就可以使用指针访问各个字符

我希望能够调用printf(“%d\n”,map[2]+1)

地图[2]+1

这将只是增加字符的ASCII值

根据我的理解,您希望将文件映射到内存中,并像整数一样更改值。 这是不可能的,只要文件是文本文件

我建议您将文件映射到内存中,读取字符,进行解析(在本例中查找空格)并更改字符值

下面是一个示例代码:

[root@mohitsinghmemoryMap]#cat sample.txt

12345

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义文件路径“/sample.txt”
#定义NUMINTS(5)
#定义文件大小(NUMINTS*sizeof(int))
int main(int argc,char*argv[])
{
int i;
int-fd;
char*map;/*mmapped字符数组*/
fd=打开(文件路径,O_RDWR);
如果(fd==-1){
perror(“打开文件读取时出错”);
退出(退出失败);
}
map=mmap(0,文件大小,PROT_READ | PROT_WRITE,map_SHARED,fd,0);
if(map==map\u失败){
关闭(fd);
perror(“映射文件时出错”);
退出(退出失败);
}
/*从mmap中逐字符读取文件
**/
对于(i=0;i
0x31 0x20 0x32 0x20 0x31 0x35 0x20 0x31 0x32 0x35 0x38 0x10
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

#define FILEPATH "./sample.txt"
#define NUMINTS  (5)
#define FILESIZE (NUMINTS * sizeof(int))

int main(int argc, char *argv[])
{
                int i;
                int fd;
                char *map;  /* mmapped array of char */

                fd = open(FILEPATH, O_RDWR);
                if (fd == -1) {
                                                perror("Error opening file for reading");
                                                exit(EXIT_FAILURE);
                }

                map = mmap(0, FILESIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
                if (map == MAP_FAILED) {
                                                close(fd);
                                                perror("Error mmapping the file");
                                                exit(EXIT_FAILURE);
                }

                /* Read the file char-by-char from the mmap
                 **/
                for (i = 0; i <NUMINTS; ++i) {
                                                printf("%d: %c\n", i, map[i]);
                }
                /*change the character value
                *Implement your own logic here to change the values as integer
                */
                map[2]='9';
                if (munmap(map, FILESIZE) == -1) {
                                                perror("Error un-mmapping the file");
                }
                close(fd);
                return 0;
}