gpt4 book ai didi

c - 将结构写入映射内存文件(mmap)

转载 作者:太空狗 更新时间:2023-10-29 17:07:18 25 4
gpt4 key购买 nike

我在将结构写入映射内存文件时遇到问题。

我有两个文件,即 mmap.write.c 和 mmap.read.c,在这些文件中,我将一个整数写入文件并从文件中读取它。

当我想编写结构并读取它时,我无法考虑,因为在 mmap.write.c 的第 32 行

sprintf((char*) file_memory, "%d\n", i);

并在 mmap.read.c 的第 25 行

sscanf (file_memory, "%d", &integer);

写入和读取整数/ double / float /字符等没有区别,因为我可以将模式作为整数的第二个参数“%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, "%d", &integer);
printf ("value: %d\n", integer);
usleep(100000);
}
//sprintf ((char*) file_memory, "%d\n", 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, 0, SEEK_SET);
/* Create the memory mapping. */
file_memory = mmap (0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd, 0);
close (fd);
/* Write a random integer to memory-mapped area. */
for(i=0; i<10000; i++) {
sprintf((char*) file_memory, "%d\n", i);
//goto a;
usleep(100000);
}
a:
/* Release the memory (unnecessary because the program exits). */
munmap (file_memory, FILE_LENGTH);
return 0;
}

非常感谢。

最佳答案

首先,您必须跟踪要写入的内存中的位置,其次,您必须记住映射内存就像任何其他指向内存的指针一样。最后一点很重要,因为这意味着您可以使用普通数组索引来访问内存,或使用诸如 memcpy 之类的函数复制到内存中。

要编写结构,您有以下三种选择:

  1. 按原样编写结构,就像在二进制文件中一样。这意味着您必须将结构memcpy 到指定位置。

  2. 将结构逐个字段写为文本,例如使用sprintf 到正确的位置。

  3. 将内存视为一个大字符串,并执行例如sprintf 将每个字段放入临时缓冲区,然后 strcat 将其添加到内存中。

关于c - 将结构写入映射内存文件(mmap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14337517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com