将struct写入映射的内存文件时遇到问题.
我有两个文件,即mmap.write.c和mmap.read.c,在这些文件中,我正在写一个整数到一个文件并从文件中读取它.
当我想编写struct并阅读它时,我无法想到这一点,因为在mmap.write.c的第32行
sprintf((char*) file_memory,"%d\n",i);
在mmap.read.c的第25行
sscanf (file_memory,"%d",&integer);
写入和读取integer / double / float / char等没有区别,因为我可以将pattern作为整数的第二个参数“%d”.但是我将在这里写下来表示结构?这是我的主要问题.
我想写和读的结构:
#define CHANNELS 20 typedef dataholder struct { int value[CHANNELS]; time_t time; int hash; }dataholder;
mmap.read.c
#include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> #include <unistd.h> #include "mmap.h" #define FILE_LENGTH 0x10000 int main (int argc,char* const argv[]) { int fd; void* file_memory; int integer; /* Open the file. */ fd = open (argv[1],O_RDWR,S_IRUSR | S_IWUSR); printf("file opened\n"); /* Create the memory mapping. */ file_memory = mmap (0,FILE_LENGTH,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0); printf("memfile opened\n"); close (fd); printf("file closed\n"); /* Read the integer,print it out,and double it. */ while(1) { sscanf (file_memory,&integer); printf ("value: %d\n",integer); usleep(100000); } //sprintf ((char*) file_memory,2 * integer); /* Release the memory (unnecessary because the program exits). */ munmap (file_memory,FILE_LENGTH); return 0; }
mmap.write.c
#include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> #include <time.h> #include <unistd.h> #include "mmap.h" #define FILE_LENGTH 0x10000 /* Return a uniformly random number in the range [low,high]. */ int random_range (unsigned const low,unsigned const high) { unsigned const range = high - low + 1; return low + (int) (((double) range) * rand () / (RAND_MAX + 1.0)); } int main (int argc,char* const argv[]) { int fd,i; void* file_memory; /* Seed the random number generator. */ srand (time (NULL)); /* Prepare a file large enough to hold an unsigned integer. */ fd = open (argv[1],O_RDWR | O_CREAT | O_APPEND,S_IRUSR | S_IWUSR); //lseek (fd,FILE_LENGTH+1,SEEK_SET); write (fd,"",1); //lseek (fd,SEEK_SET); /* Create the memory mapping. */ file_memory = mmap (0,PROT_WRITE,0); close (fd); /* Write a random integer to memory-mapped area. */ for(i=0; i<10000; i++) { sprintf((char*) file_memory,i); //goto a; usleep(100000); } a: /* Release the memory (unnecessary because the program exits). */ munmap (file_memory,FILE_LENGTH); return 0; }
非常感谢提前.