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;
}